De correspondance de plusieurs modèles regex avec l'alternance de l'opérateur?
J'ai rencontré un petit problème à l'aide de Python Regex.
Suppose que c'est le d'entrée:
(zyx)bc
Ce que je suis en train de réaliser est d'obtenir tout ce qui est entre parenthèses comme un seul match, et tout char de l'extérieur comme un match individuel. Le résultat souhaité serait d'être le long des lignes de:
['zyx','b','c']
L'ordre des matchs doivent être conservés.
J'ai essayé de l'obtention de ce avec Python 3.3, mais n'arrive pas à trouver le bon Regex. Pour l'instant j'ai:
matches = findall(r'\((.*?)\)|\w', '(zyx)bc')
print(matches)
les rendements suivants:
['zyx','','']
Les idées de ce que je fais mal?
Pourquoi ne pas simplement
C'était juste un exemple d'entrée. L'expression régulière doit être en mesure de distinguer les différents cas, par exemple (ab)(bc), (ca), abc (abc)(abc)(abc), ou (zyx)bc, etc, tout en reconnaissant les caractères qui sont à l'intérieur de parenthèses et qui ne le sont pas.
xyz|a|b
?C'était juste un exemple d'entrée. L'expression régulière doit être en mesure de distinguer les différents cas, par exemple (ab)(bc), (ca), abc (abc)(abc)(abc), ou (zyx)bc, etc, tout en reconnaissant les caractères qui sont à l'intérieur de parenthèses et qui ne le sont pas.
OriginalL'auteur Julian Laval | 2013-01-06
Vous devez vous connecter pour publier un commentaire.
À partir de la documentation de
re.findall
:Alors que la regexp est correspondant de la chaîne à trois reprises, le
(.*?)
groupe est vide pour le deuxième en deux matchs. Si vous voulez la sortie de l'autre moitié de la regexp, vous pouvez ajouter un deuxième groupe:Alternativement, vous pouvez supprimer tous les groupes pour obtenir une simple liste de chaînes, nouveau:
Vous devez supprimer manuellement les parenthèses.
OriginalL'auteur James Henstridge
Prenons un coup d'oeil à notre sortie à l'aide d'
re.DEBUG
.Aïe, il n'y a qu'un
subpattern
là, maisre.findall
seul sortsubpattern
s si il en existe un!Mieux. 🙂
Maintenant nous avons juste à faire cela dans le format que vous voulez.
OriginalL'auteur Fredrick Brennan
Les docs mentionner le traitement de groupes spécialement, afin de ne pas mettre un groupe autour de la mise entre parenthèses de modèle, et vous aurez tout, mais vous aurez besoin de supprimer les parens de la correspondance des données vous-même:
ou de l'utilisation de plusieurs groupes, processus de tuples obtenus pour obtenir les chaînes de vous demander:
OriginalL'auteur Ned Batchelder
OriginalL'auteur Ashwini Chaudhary
D'autres réponses ont montré comment obtenir le résultat que vous avez besoin, mais avec l'étape supplémentaire de supprimer manuellement les parenthèses. Si vous utilisez lookarounds dans votre regex, vous n'aurez pas besoin de dénuder les parenthèses manuellement:
Expliqué:
OriginalL'auteur alan