Ich möchte mit regulären Ausdrücken Wörter in Gruppen von (vowels, not_vowels, more_vowels)
unter Verwendung eines Markers aufteilen, um sicherzustellen, dass jedes Wort mit einem Vokal beginnt und endet.Reguläre Ausdrücke von Python: Erfassen von Lookahead-Werten (Erfassen von Text, ohne es zu konsumieren)
import re
MARKER = "~"
VOWELS = {"a", "e", "i", "o", "u", MARKER}
word = "dog"
if word[0] not in VOWELS:
word = MARKER+word
if word[-1] not in VOWELS:
word += MARKER
re.findall("([%]+)([^%]+)([%]+)".replace("%", "".join(VOWELS)), word)
In diesem Beispiel erhalten wir:
[('~', 'd', 'o')]
Das Problem ist, dass ich die Spiele wollen, überlappen - der letzte Satz von Vokalen sollte der erste Satz des nächsten Spiel werden. Dies scheint möglich, mit Lookaheads, wenn wir die Regex wie folgt ersetzen:
re.findall("([%]+)([^%]+)(?=[%]+)".replace("%", "".join(VOWELS)), word)
Wir erhalten:
[('~', 'd'), ('o', 'g')]
Was bedeutet, wir passen, was ich will. Es gibt jedoch jetzt nicht den letzten Satz von Vokalen zurück. Der Ausgang ich will, ist:
[('~', 'd', 'o'), ('o', 'g', '~')]
Ich empfinde dies möglich sein soll (wenn die Regex für den zweiten Satz von Vokalen überprüfen, ich sehe keinen Grund, es nicht darauf zurückkommen kann), aber ich kann nicht finden, Jede Möglichkeit, dies über die Brute-Force-Methode hinaus zu tun, indem ich die Ergebnisse durchlaufe, nachdem ich sie gefunden habe, und das erste Zeichen der nächsten Übereinstimmung an die letzte Übereinstimmung anfüge und das letzte Zeichen der Zeichenfolge an die letzte Übereinstimmung. Gibt es einen besseren Weg, wie ich das machen kann?
Die zwei Dinge, die funktionieren würden, wäre die Erfassung des Lookahead-Wertes, oder nicht den Text auf einer Übereinstimmung zu konsumieren, während der Wert erfasst wird - ich kann auch keinen Weg finden.
einen besonderen Grund, warum ich auf dies einen downvote bekam? –