2010-05-27 8 views
0

J'essaie d'extraire/mettre en correspondance des données d'une chaîne en utilisant une expression régulière, mais je ne semble pas l'avoir.Python correspondant à certains caractères dans une chaîne

Je wan't pour extraire de la chaîne qui suit le i386 (Le texte entre la dernière - et .iso):

/xubuntu/daily/current/lucid-alternate-i386.iso 

Cela devrait aussi fonctionner en cas de:

/xubuntu/daily/current/lucid-alternate-amd64.iso 

Et le résultat devrait être soit i386 ou amd64 étant donné le cas.

Merci beaucoup pour votre aide.

Répondre

1

Si vous allez faire correspondre plusieurs de ces lignes en utilisant re.compile() et en enregistrant l'objet d'expression régulière qui en résulte pour réutilisation is more efficient.

s1 = "/xubuntu/daily/current/lucid-alternate-i386.iso" 
s2 = "/xubuntu/daily/current/lucid-alternate-amd64.iso" 

pattern = re.compile(r'^.+-(.+)\..+$') 

m = pattern.match(s1) 
m.group(1) 
'i386' 

m = pattern.match(s2) 
m.group(1) 
'amd64' 
+0

vous n'avez pas besoin de regex pour cela http://stackoverflow.com/questions/2925306/python-matching-some-characters-into-a-string/2925399#2925399 – jfs

+0

Je sais mais il est marqué python et regex –

1
r"/([^-]*)\.iso/" 

Le bit que vous voulez sera dans le premier groupe de capture.

+0

Merci! Mais ne fonctionne pas :( – user175259

+0

Étiez-vous en train d'utiliser 'match()' ou 'search()'? Comme il s'agit d'un modèle de correspondance partielle, il devrait être utilisé avec 'search()' pas 'match()' (puisque 'match()' tente de faire correspondre toute la chaîne, pas seulement une partie.) – Amber

1

Tout d'abord, rendons notre vie plus simple et n'obtenons que le nom du fichier.

>>> os.path.split("/xubuntu/daily/current/lucid-alternate-i386.iso") 
('/xubuntu/daily/current', 'lucid-alternate-i386.iso') 

Maintenant, il suffit d'attraper toutes les lettres entre le dernier tiret et le '. Iso'.

+0

Je suis toujours confronté au problème qui n'arrive pas à extraire le texte désiré :((Je n'ai jamais été bon avec regexp) – user175259

3

Vous pouvez également utiliser split dans ce cas (au lieu de regex):

>>> str = "/xubuntu/daily/current/lucid-alternate-i386.iso" 
>>> str.split(".iso")[0].split("-")[-1] 
'i386' 

split vous donne une liste des éléments sur lesquels votre chaîne se est « divisé ». Puis en utilisant slicing syntax de Python vous pouvez obtenir les parties appropriées.

+0

Génial !! Merci – user175259

+0

'str.rsplit ('. Iso', 1) [0] .rsplit ('-', 1) [- 1]' – jfs

+0

'str.rpartition ('.iso') [0]. rpartition ('-') [- 1] ' – jfs

0

L'expression doit être sans les barres obliques de début.

import re 

line = '/xubuntu/daily/current/lucid-alternate-i386.iso' 
rex = re.compile(r"([^-]*)\.iso") 
m = rex.search(line) 
print m.group(1) 

Les rendements de l'i386 '

0
reobj = re.compile(r"(\w+)\.iso$") 
match = reobj.search(subject) 
if match: 
    result = match.group(1) 
else: 
    result = "" 

Objet contient le nom du fichier et le chemin.

0
>>> import os 
>>> path = "/xubuntu/daily/current/lucid-alternate-i386.iso" 
>>> file, ext = os.path.splitext(os.path.split(path)[1]) 
>>> processor = file[file.rfind("-") + 1:] 
>>> processor 
'i386' 
Questions connexes