2017-09-26 4 views
2
import re 
string = "some text \n\n\nError on the field: more\n text and lines\n\n\nError on the field: some more\n lines \n\n\nError on the field: final lines" 
pieces = re.split(r'(Error on the field:)', string, re.IGNORECASE) 
pieces 
['some text \n\n\n', 'Error on the field:', ' more\n text and lines\n\n\n', 'Error on the field:', ' some more\n lines \n\n\nError on the field: final lines'] 
pieces2 = re.split(r'(Error on the field:)', pieces[4], re.IGNORECASE) 
pieces2 
[' some more\n lines \n\n\n', 'Error on the field:', ' final lines'] 

Pourquoi la troisième division du 'Error on the field:' pas repris dans la scission initiale de pieces, mais est ramassé quand vous divisez pieces[4]?re.split python ne fonctionne pas pour tous les champs

+0

Il suffit d'utiliser 're.split (r '(? I) (Erreur sur le champ :)', chaîne)' – kaza

Répondre

5

arguments de position de re.split sont:

  • regex
  • chaîne
  • maxsplit (valeur par défaut: illimité)
  • drapeaux (valeur par défaut: pas de drapeaux)

    split(pattern, string, maxsplit=0, flags=0)

vous passez re.IGNORECASE (la valeur du drapeau est 2) comme maxsplit argument (comme postional) qui explique l'effet étrange. Cela fonctionne jusqu'à un certain point puis il arrête les divisions comme indiqué après 2 divisions.

Juste faire flags=re.IGNORECASE (mot-clé, pas de position) à la place et cela fonctionne.

En re.compile vous pouvez passer ce drapeau comme position en toute sécurité: compile(pattern, flags=0), et ce qui est vrai pour re.match et re.search aussi bien, mais pas pour re.split & re.sub, il est donc un piège facile à tomber. En cas de doute, utilisez toujours un mot de passe pour les arguments facultatifs.

2

Vous devez indiquer explicitement utiliser des indicateurs à l'aide flags= lors de l'utilisation re.split:

import re 
string = "some text \n\n\nError on the field: more\n text and lines\n\n\nError on the field: some more\n lines \n\n\nError on the field: final lines" 
pieces = re.split(r'(Error on the field:)', string, flags=re.I) 

print(pieces) 

Sortie:

['some text \n\n\n', 'Error on the field:', ' more\n text and lines\n\n\n', 'Error on the field:', ' some more\n lines \n\n\n', 'Error on the field:', ' final lines'] 

N.B.re.I est le même que re.IGNORECASE