2
votes

Problème de division du groupe de capture Python regex

Essayer de comprendre un exemple de regex en python et voici mon code

#output ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', '     foo']

Dans la sortie, il montre les chaînes et les séparateurs, le dernier séparateur est une virgule avec cinq espaces pas seulement un virgule

Si le séparateur était juste une virgule, la sortie ne devrait-elle pas être comme ça?

line='bar asdfgh klmn,     foo'
print(re.split(r'(;|,|\s)\s*',line))
#output is ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', 'foo']


0 commentaires

3 Réponses :



3
votes

Si des groupes de capture sont utilisés dans l'expression régulière, alors re.split inclut le contenu des groupes capturés. Cependant, il utilise toujours la correspondance entière comme séparateur, ce qui conduit au comportement que vous avez observé. Si vous voulez que "" .join (split_results) soit égal à la chaîne d'origine, vous devrez capturer le séparateur entier (et utiliser des parenthèses non capturantes là où vous avez maintenant des parenthèses: < code> r '((?:; |, | \ s) \ s *)' ).


0 commentaires

2
votes

Je recommanderais de diviser sur le modèle suivant:

line='bar asdfgh klmn,     foo'
print(re.split(r'\s*[,;]?\s+', line))

['bar', 'asdfgh', 'klmn', 'foo']

Cela dit de diviser sur un espace blanc facultatif et un séparateur virgule ou point-virgule, suivi d'un ou plusieurs espaces.

\s*[,;]?\s+

Le problème avec votre modèle actuel est qu'il laisse un espace facultatif, si un séparateur virgule / point-virgule est présent. Cela entraîne l'apparition d'espaces comme des termes correspondants.


0 commentaires