2016-09-09 2 views
0

Ich benutze re.match die Zeichenfolge wie folgt zu finden:Warum funktioniert re.match/re.search, aber re.findall funktioniert nicht?

print(re.match('''#include(\s)?".*"''', '''#include "my.h"''')) 

dann bekam ich das Ergebnis wie folgt aus:

<_sre.SRE_Match object; span=(0, 15), match='#include "my.h"'> 

und ich Match-Funktion dann ersetzen:

print(re.findall('''#include(\s)?".*"''', '''#include "my.h"''')) 

das Ergebnis ist:

[' '] 

Ich war verwirrt, warum nicht re.findall die passende Zeichenfolge zurückgeben? Was stimmt nicht mit meinem regulären Ausdruck?

Antwort

0

Von help(re.findall):

Rückkehr eine Liste aller nicht-überlappenden Übereinstimmungen in der Zeichenkette.

Wenn eine oder mehrere Erfassungsgruppen im Muster vorhanden sind, geben Sie eine Liste der Gruppen zurück; Dies wird eine Liste von Tupeln sein, wenn das Muster mehr als eine Gruppe hat.

Leere Treffer sind im Ergebnis enthalten.

Ihr klammerten Bit, (\s), ist eine Erfassungsgruppe, so kehrt re.findall eine Liste der Aufnahmen. Da ’ nur eine Erfassungsgruppe ist, ist jedes Element in der Liste nur eine Zeichenfolge und kein Tupel.

Sie können die Gruppe nicht erfassen mit ?:, d. H. (?:\s)?. Das ist ’ t sehr nützlich zu diesem Zeitpunkt, da es ’ s nur \s? entspricht. Für mehr Flexibilität – z.B. Wenn Sie jemals mehr als ein Teil erfassen müssen – re.finditer ist wahrscheinlich der beste Weg zu gehen:

for m in re.finditer(r'#include\s*"(.*?)"', '#include "my.h"'): 
    print('Included %s using %s' % (m.group(1), m.group(0))) 
Verwandte Themen