la différence de b/w [ab] et (a|b) dans les regex match?
Je savais que []
désigne un ensemble de caractères autorisés -
>>> p = r'^[ab]$'
>>>
>>> re.search(p, '')
>>> re.search(p, 'a')
<_sre.SRE_Match object at 0x1004823d8>
>>> re.search(p, 'b')
<_sre.SRE_Match object at 0x100482370>
>>> re.search(p, 'ab')
>>> re.search(p, 'ba')
Mais ... aujourd'hui, je suis tombé sur une expression avec des barres verticales à l'intérieur des parenthèses pour définir mutuellement exclusifs modèles -
>>> q = r'^(a|b)$'
>>>
>>> re.search(q, '')
>>> re.search(q, 'a')
<_sre.SRE_Match object at 0x100498dc8>
>>> re.search(q, 'b')
<_sre.SRE_Match object at 0x100498e40>
>>> re.search(q, 'ab')
>>> re.search(q, 'ba')
Ce qui semble reproduire les mêmes fonctionnalités que ci-dessus, ou ai-je raté quelque chose?
PS: Dans Python
parenthèse eux-mêmes sont utilisés pour définir des groupes logiques de texte correspondant. Si j'utilise la deuxième technique, alors comment puis-je utiliser les parenthèses pour les deux emplois?
Pas sûr de ce que tu veux dire avec la parenthèse peu...
Oui, vous avez raison -
Oui, vous avez raison -
[ab]
et (a|b)
à la fois correspondre à exactement la même chose (mais le premier match sera plus rapide). Les expressions régulières sont un langage à eux-mêmes (si vous les trouvez en Python ou Perl) et vous avez besoin d'apprendre leur (cryptique) syntaxe si vous prévoyez de les utiliser efficacement. (par exemple, les Parenthèses à l'intérieur d'une regex ne sont pas les mêmes que les parenthèses à l'extérieur de la regex.) Je recommande le tutoriel de regular-expressions.info. Le temps passé, il sera récompensé de nombreuses fois.OriginalL'auteur Vaibhav Bajpai | 2011-07-10
Vous devez vous connecter pour publier un commentaire.
Dans ce cas c'est la même chose.
Cependant, l'alternance n'est pas seulement limitée à un seul personnage. Par exemple,
correspondra à "bonjour" ou "monde" (et seulement ces deux entrées) alors que
serait tout simplement correspondre à un seul caractère ("h" ou "w" ou "d" ou autres joyeusetés).
Heureux de codage.
OriginalL'auteur
[ab]
correspond à un caractère (a ou b) et ne rend pas compte de groupe.(a|b)
capture a ou b, et les matchs. Dans ce cas, pas de grande différence, mais dans des cas plus complexes[]
ne peut contenir que des caractères et des classes, alors que(|)
peut contenir un nombre arbitraire de complexe regex sur chaque côté du tubeOriginalL'auteur Jim Deville
Dans l'exemple que vous avez donné qu'ils sont interchangeables. Il y a quelques différences à noter:
Dans la classe de caractères entre crochets vous n'avez pas à échapper à quelque chose, mais un tableau de bord ou de crochets, ou l'accent circonflexe ^ (mais alors seulement si c'est le premier caractère).
Parenthèses de capture correspond donc vous pouvez vous y référer plus tard. La classe de caractères correspond à ne pas le faire.
Vous pouvez faire correspondre multi-chaînes de caractères entre parenthèses, mais pas dans les classes de caractères
OriginalL'auteur ratsbane