2010-08-20 6 views
11

Je sais que pour l'analyse je devrais idéalement supprimer tous les espaces et les sauts de ligne mais je faisais juste cela comme une solution rapide pour quelque chose que j'essayais et je n'arrive pas à comprendre pourquoi ça ne marche pas. dans mon document avec les emballages comme "#### 1" et j'essaie d'analyser en fonction de cela, mais il ne fonctionne pas, peu importe ce que j'essaie, je pense que j'utilise multiline correctement .. tous les conseils sont appréciésregex Python, motif correspondant sur plusieurs lignes .. pourquoi cela ne fonctionne pas?

Cela renvoie aucun résultat du tout:

string=' 
####1 
ttteest 
####1 
ttttteeeestt 

####2 

ttest 
####2' 

import re 
pattern = '.*?####(.*?)####' 
returnmatch = re.compile(pattern, re.MULTILINE).findall(string) 
return returnmatch 
+1

Il ne fonctionnera pas parce que la période que vous n'êtes pas en utilisant des symboles de chaîne multi-lignes ' '' '' 'ou """ ' –

+0

ok, j'ai raté ce concept complètement alors, je vais creuser à travers la documentation re pour trouver où il mentionne cela .. merci – Rick

+3

Votre affectation à 'string' est une erreur de syntaxe. Voulez-vous dire d'utiliser' '' ''? – msw

Répondre

12

Essayez re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL) (fonctionne avec re.compile aussi, bien sûr).

Cette expression rationnelle renverra des tuples contenant le numéro de la section et le contenu de la section.

Pour votre exemple, cela renverra [('1', 'ttteest'), ('2', ' \n\nttest')].

(BTW: votre exemple ne fonctionne pas, pour les chaînes multilignes, utilisez ''' ou """)

+0

merci, cela fonctionne – Rick

19

multiligne ne signifie pas . correspondra retour à la ligne, cela signifie que ^ et $ sont limitées aux lignes seulement

RE.M re.MULTILINE

Lorsque spécifié, le caractère de modèle '^' correspond au début de la chaîne et à la> Begi la mise en place de chaque ligne (immédiatement après chaque nouvelle ligne); et le caractère de motif '$'> correspond à la fin de la chaîne et à la fin de chaque ligne (précédant immédiatement chaque nouvelle ligne). Par défaut, '^' correspond seulement au début de la chaîne, et '$' seulement à la fin de la chaîne et immédiatement avant le retour à la ligne (le cas échéant) à la fin de la chaîne.

re.S ou re.DOTALL fait . nouvelles lignes correspondent même.

Source

http://docs.python.org/

Questions connexes