Die typische Lösung hier ist die Verwendung von regulären und regulären Gruppen für die Erfassung von Captures. Da Regex-Änderungen von links nach rechts geparst werden, setzen Sie zuerst Ausnahmen auf die Regel (als Nicht-Capture) und enden mit dem Wechsel, für den Sie auswählen möchten.
import re
text = "Once upon a time, in a time far far away, dogs ruled the world. The End."
query = re.compile(r"""
Once upon a time| # literally 'Once upon a time',
# should not be selected
time\b # from the word 'time'
(.*) # capture everything
\bend # until the word 'end'
""", re.X | re.I)
result = query.findall(text)
# result = ['', ' far far away, dogs ruled the world. The ']
Sie können die leere Gruppe Streifen aus (die in gesetzt wurde, wenn wir die unerwünschte Zeichenfolge angepasst)
result = list(filter(None, result))
# or result = [r for r in result if r]
# [' far far away, dogs ruled the world. The ']
und dann die Ergebnisse Streifen
result = list(map(str.strip, filter(None, result)))
# or result = [r.strip() for r in result if r]
# ['far far away, dogs ruled the world. The']
Diese Lösung ist besonders nützlich, Wenn Sie eine Reihe von Phrasen haben, denen Sie ausweichen möchten.
phrases = ["Once upon a time", "No time like the present", "Time to die", "All we have left is time"]
querystring = r"time\b(.*)\bend"
query = re.compile("|".join(map(re.escape, phrases)) + "|" + querystring, re.I)
result = [r.strip() for r in query.findall(some_text) if r]
Was Sie bisher getan haben? –
Können Sie die gewünschte Ausgabe klären? Sie möchten das maximale (gierige) Match oder das minimale Match? – wim
Ich möchte 'weit weit weg, Hunde regiert die Welt. Das '(minimal) @wim – Michael