6
votes

Faites correspondre une partie d'une chaîne jusqu'à atteindre la fin de la ligne (Python Regex)

Si j'ai une grande chaîne avec plusieurs lignes et que je veux faire correspondre une partie d'une ligne uniquement à la fin de cette ligne, quelle est la meilleure façon de le faire?

Donc, par exemple, j'ai quelque chose comme ça et Je veux qu'il arrête de faire correspondre quand il atteint le nouveau caractère de ligne. xxx

J'ai vu cela dans un réponse précédente :

$ - indique la correspondance à la fin de la chaîne ou à la fin d'une ligne si multiline est activé.

Ma question est alors comment "activer Multiline" comme l'auteur de cette réponse étatique?


0 commentaires

3 Réponses :


1
votes

2 commentaires

Ceci n'est pas utile - permettant au mode multiligne ne résoudra pas son problème.


Droite, et si quelqu'un vous demande s'il devait tenir son marteau vers le haut ou vers le bas pour conduire dans une vis, vous ne lui diriez pas d'utiliser un tournevis à la place :)



2
votes

Vous pouvez activer la correspondance multiline en passant re.multiline comme deuxième argument sur re.compile () . Cependant, il y a une subtilitée à surveiller: car le quantificateur + est gourmand, cette expression régulière correspondra aussi longtemps que possible une chaîne possible, alors si la ligne suivante est composée de lettres et d'espaces, La regex peut correspondre à plus d'une ligne ( $ correspond à la fin de n'importe quelle chaîne ).

Il y a trois solutions à ceci:

  1. Changez votre regex afin que, au lieu de faire correspondre n'importe quel espace blanche, y compris NEWLINE ( \ s ) Votre jeu de caractères répété ne correspond pas à la nouvelle ligne.
  2. changez le quantificateur vers +? , la version non gourmande ("minimale") de + , de sorte qu'il correspond à une chaîne aussi courte que possible et donc arrêtez-vous au premier nouvelle ligne.
  3. Changez votre code en premier divisé le texte en une chaîne individuelle pour chaque ligne (en utilisant text.split ('\ n') . .

2 commentaires

Merci pour les solutions! Le premier semble le plus facile à mettre en œuvre. Savez-vous spécifiquement comment je peux spécifier, je veux seulement que des espaces simples soient appariés par opposition à tout blancheur? J'ai essayé la deuxième solution mais cela ne correspond que d'un seul caractère.


Mon mauvais, aurait dû mentionner - pour toutes ces solutions, vous devez également inclure l'ancre $ (fin de chaîne) à la fin. De cette façon, avec la solution 2, re trouvera la chaîne la plus courte correspondant au regex et monte jusqu'à la fin d'une ligne, ce qui correspond à ce que vous voulez. Pour la solution 1, un espace peut être représenté dans un caractère défini par un espace littéral - aucune évasion requise (c'est-à-dire [a-za-z.] )



12
votes

Utilisez simplement

r"(?P<name>[A-Za-z\t .]+)"


0 commentaires