2017-10-02 1 views
-1

Ich versuche, widerwillige Quantifier für eine Gruppe zu verwenden, aber es funktioniert nicht wie erwartet. Derselbe Regex funktioniert jedoch perfekt mit Online-Regex-Tools wie https://regexr.com/.Python Regex: widerstrebende Quantifier mit Capturing-Gruppe

re.findall(r"(ab)?c", "c")  # this returns [''], when I expect ['c'] 
re.findall(r"(ab)?c", "abc") # this returns ['ab'], when I expect ['abc'] 

Ich erwarte, dass die Regex r "(ab)? C" zu "c" oder "abc" passt.

Was fehlt mir hier?

+0

Schaust du dir vielleicht die Capture-Gruppen anstelle des vollständigen Spiels an? Veröffentlichen Sie Ihre Daten in [regex101] (https://regex101.com) und generieren Sie Code, fügen Sie diesen in Ihren Code ein. Es sollte Ihnen korrekte Ergebnisse liefern. – ctwheels

Antwort

1

Aus der Dokumentation von re.findall:

Wenn eine oder mehrere einfangende Gruppen im Muster vorhanden sind, eine Liste von Gruppen;

Wenn Ihr Muster also eine Gruppe enthält, wird die Gruppe zurückgegeben. In Ihrem ersten Beispiel wird nichts zurückgegeben, da die übereinstimmende Gruppe nicht gefunden werden kann, und im zweiten Beispiel wird nur die Gruppe zurückgegeben.

Was suchen Sie mit re.search erreicht werden kann https://docs.python.org/3/library/re.html#re.regex.search:

>>> re.search(r"(ab)?c", "c") 
<_sre.SRE_Match object; span=(0, 1), match='c'> 

>>> re.search(r"(ab)?c", "abc") 
<_sre.SRE_Match object; span=(0, 3), match='abc'> 

Sie können die Gruppen abrufen, indem .groups() auf dem Ergebnis des Aufrufs Aufruf

Wenn Sie in einem String search wollen nicht Überprüfen Sie jedoch, ob die Zeichenfolge mit einem Muster übereinstimmt (und möglicherweise die Gruppen sehen). Verwenden Sie re.match (Details zu deren Abweichungen finden Sie unter search vs match).

+0

Danke. Das half beim Verstehen des Verhaltens, wenn Gruppen im Muster vorhanden sind. – whitehat