Passende mehrere regex-Muster mit der alternation operator?
Ich lief in ein kleines problem mit Python Regex.
Vermute, das ist der Eingang:
(zyx)bc
Was ich versuche zu erreichen, ist erhalten, was zwischen Klammern als ein einziges Spiel, und jeder char außen als ein einzelnes Spiel. Das gewünschte Ergebnis wäre entlang der Linien von:
['zyx','b','c']
Die Reihenfolge der Spiele sollte eingehalten werden.
Habe ich versucht, den Erhalt dieses mit Python 3.3, kann aber nicht scheinen, um herauszufinden, die richtige Regex. Bisher habe ich:
matches = findall(r'\((.*?)\)|\w', '(zyx)bc')
print(matches)
ergibt die folgenden:
['zyx','','']
Irgendwelche Ideen was ich falsch mache?
- Warum nicht einfach
xyz|a|b
? - Es war nur ein Beispiel für die Eingabe. Die regex sollte in der Lage sein, zu differenzieren zwischen verschiedenen Fällen, werden Sie zum Beispiel (ab)(bc)(ca), abc (abc)(abc)(abc) oder (zyx)bc, etc, während Sie erkennen, welche chars sind in Klammern gesetzt werden und welche nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Dokumentation der
re.findall
:Während regexp vergleicht den string drei mal die
(.*?)
Gruppe ist leer, für die zweite zwei Spiele. Wenn Sie möchten, dass der output von der anderen Hälfte des regexp, Sie können hinzufügen, eine zweite Gruppe:Alternativ können Sie entfernen Sie alle Gruppen, um eine einfache Liste von strings wieder:
Müssen Sie manuell entfernen Sie die Klammern, wenn.
Let ' s werfen Sie einen Blick auf unsere Ausgabe mit
re.DEBUG
.Autsch, da ist nur ein
subpattern
aberre.findall
nur ziehtsubpattern
s, wenn einer vorhanden ist!Besser. 🙂
Jetzt müssen wir nur, um diese in das gewünschte format.
Die Dokumente erwähnen die Behandlung von Gruppen speziell, also nicht legen Sie eine Gruppe um den in Klammern eingeschlossene Muster, und Sie werden alles bekommen, aber Sie müssen entfernen Sie die Klammern aus dem gefundenen Daten selbst:
verwenden oder mehr Gruppen, dann den resultierenden Tupeln, um die Zeichenfolgen, die Sie suchen:
Anderen Antworten haben dir gezeigt, wie man das Ergebnis Sie brauchen, aber mit dem zusätzlichen Schritt manuell zu entfernen die Klammern. Wenn Sie mit lookarounds in deinem regex, brauchen Sie sich nicht auszuziehen, um die Klammern manuell:
Erklärt: