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 - [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