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']
3 Réponses :
Dans ce cas, votre expression régulière correspond à "un point-virgule, une virgule ou un espace blanc (qui est capturé et renvoyé) suivi de 0 ou plusieurs espaces blancs (qui sont ignorés)". Par conséquent, l'espace blanc après la virgule dans votre exemple est consommé lorsque la virgule correspond et n'est pas présente dans votre sortie.
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 *)' ).
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.