re.findall-nicht wieder in voller übereinstimmung?
Ich habe eine Datei, die enthält eine Reihe von Zeichenfolgen wie "size=XXX;". Ich versuche, python-re-Modul zum ersten mal und bin ein wenig verwirrt durch das folgende Verhalten: wenn ich ein Rohr für 'oder' in einem regulären Ausdruck, ich sehe nur, dass etwas von der übereinstimmung zurückgegeben. E. g.:
>>> myfile = open('testfile.txt','r').read()
>>> print re.findall('size=50;',myfile)
['size=50;', 'size=50;', 'size=50;', 'size=50;']
>>> print re.findall('size=51;',myfile)
['size=51;', 'size=51;', 'size=51;']
>>> print re.findall('size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']
>>> print re.findall(r'size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']
Den "size=" Teil des Spiels Weg ist. (Aber es wird sicherlich in der Suche verwendet, andernfalls würde es zu mehr Ergebnissen). Was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem, das Sie haben, ist, dass, wenn die regex
re.findall
versucht, Gruppen erfasst (d.h. die Teile des regex, die in Klammern eingeschlossen sind), dann ist es die Gruppen, die zurückgegeben werden, anstatt die übereinstimmenden Zeichenfolgen.Eine Möglichkeit zur Lösung dieses Problems ist die Verwendung nicht-Erfassung von Gruppen (mit dem Präfix
?:
).Wenn die regex
re.findall
versucht, nicht erfasst alles, es gibt die ganze der übereinstimmenden Zeichenfolge.Obwohl die Verwendung von Charakter-Klassen vielleicht die einfachste option ist in diesem speziellen Fall, nicht erfassende Gruppen stellen Sie eine Allgemeine Lösung.
Wenn ein regulärer Ausdruck Klammern enthält, Sie erfassen Ihre Inhalte zu Gruppen, eine änderung des Verhaltens der
findall()
nur wieder diese Gruppen. Hier ist der relevante Abschnitt aus die docs:Zu vermeiden, dieses Verhalten, können Sie eine nicht-Erfassung Gruppe:
Wieder von den docs:
'size=(50|51);'
heißt, Sie sind auf der Suche fürsize=50
odersize=51
sondern nur passend zu den50
oder51
Teil (man beachte die Klammern), daher es nicht zurücksign=
.Wenn Sie möchten, dass die
sign=
zurückgegeben, die Sie tun können:(...)
definiert ein match-Gruppe. Sie können auch(size=(50|51))
wo Sie über zwei wettkampf-Gruppen, die erste ist die vollesize=5X
und die zweite nur die5X
Teil.Ich denke, was Sie wollen, ist mit [] statt (). [] angibt Satz von Zeichen while () - Anzeige-group übereinstimmen. Probieren Sie etwas wie dieses:
In einigen Fällen, die non-capturing-group ist nicht angemessen, zum Beispiel mit regex, die erkennt, wiederholte Wörter (Beispiel aus python docs)
In dieser situation zu bekommen ganze match kann man
Beachten Sie, dass
\1
verändert hat\2
.