2009-01-11 4 views
6

J'ai récemment un livre sur python et il y a un chapitre sur Regex, il y a une section de code que je ne comprends pas vraiment. Quelqu'un peut-il expliquer exactement ce qui se passe ici (cette section est sur les groupes Regex)?Python-Regex, que se passe-t-il ici?

>>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)' 
>>> addrs = "Zip: 10010 State: NY" 
>>> y = re.search(my_regex, addrs) 
>>> y.groupdict('zip') 
{'zip': 'Zip: 10010'} 
>>> y.group(2) 
'State: NY' 
+0

Quelle partie ne comprenez-vous pas? Regex en général, ou comment python retire le groupe 'zip' et le second groupe (sans nom)? En ajoutant plus de détails à votre question, vous obtiendrez de meilleures réponses plus ciblées. –

+0

cela signifie simplement qu'il crée un groupe appelé zip qui fait ce que le reste de la ligne indique comme "Zip: \ s * \ d \ d \ d \ d) \ s * (Etat: \ s * \ w \ w) " puis le reste crée un dict appelé groupdict avec le Zip et l'Etat Je pense que je l'ai eu :) – user33061

Répondre

8

définition regex:

(?P<zip>...) 

crée un groupe nommé "zip"

Zip:\s* 

Match "Zip:" et zéro ou plusieurs espaces

\d 

match un chiffre

\w 

match un caractère de mot [A-Za-z0-9_]

y.groupdict('zip') 

La méthode groupdict retourne un dictionnaire avec des groupes nommés comme les clés et leurs matchs en tant que valeurs. Dans ce cas, le match pour le groupe « zip » est renvoyée

y.group(2) 

Retourner le match pour le deuxième groupe, qui est un groupe sans nom « (...) »

Espoir qui aide.

+0

merci, c'était ce que je cherchais – user33061

2

La méthode recherche retourne un objet contenant les résultats de votre modèle de regex.

groupedict renvoie un dictionnaire des groupes dont les clés sont le nom des groupes définis par (? P ...). Ici nom est un nom pour le groupe.

Le groupe renvoie la liste des groupes correspondants. "State: NY" est votre troisième groupe. Le premier est la chaîne entière et le second est "Zip: 10010".

C'était une question relativement simple en passant. J'ai simplement regardé la documentation de la méthode sur google et trouvé this page. Google est ton ami.

0

La syntaxe (?P<identifier>match) est la façon de Python d'implémenter des groupes de capture nommés. De cette façon, vous pouvez accéder à ce qui a été apparié par match en utilisant un nom au lieu d'un numéro séquentiel.

Depuis la première série de parenthèses est nommé zip, vous pouvez accéder à son jeu en utilisant la méthode groupdict de match pour obtenir une paire {identifier: match}. Ou vous pouvez utiliser y.group('zip') si vous êtes seulement intéressé par le match (ce qui est généralement logique puisque vous connaissez déjà l'identifiant). Vous pouvez également accéder au même match en utilisant son numéro séquentiel (1). Le prochain match est sans nom, donc le seul moyen d'y accéder est son numéro.

1
# my_regex = r' <= this means that the string is a raw string, normally you'd need to use double backslashes 
# (...) this groups something 
# ? this means that the previous bit was optional, why it's just after a group bracket I know not 
# * this means "as many of as you can find" 
# \s is whitespace 
# \d is a digit, also works with [0-9] 
# \w is an alphanumeric character 
my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)' 
addrs = "Zip: 10010 State: NY" 

# Runs the grep on the string 
y = re.search(my_regex, addrs) 
0

Ajout aux réponses précédentes: À mon avis, vous feriez mieux de choisir un type de groupe (nommé ou non) et de s'y tenir. Normalement, j'utilise des groupes nommés.Par exemple:

>>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(?P<state>State:\s*\w\w)' 
>>> addrs = "Zip: 10010 State: NY" 
>>> y = re.search(my_regex, addrs) 
>>> print y.groupdict() 
{'state': 'State: NY', 'zip': 'Zip: 10010'} 
Questions connexes