Python 3.4 führte die neue Regex-Methode re.fullmatch(pattern, string, flags=0)
ein.Backport Python 3.4 der reguläre Ausdruck "fullmatch()" zu Python 2
Hat jemand diese neue Methode zu älteren Python-Versionen zurück portiert?
Python 3.4 führte die neue Regex-Methode re.fullmatch(pattern, string, flags=0)
ein.Backport Python 3.4 der reguläre Ausdruck "fullmatch()" zu Python 2
Hat jemand diese neue Methode zu älteren Python-Versionen zurück portiert?
Um sicherzustellen, dass die gesamte Zeichenfolge übereinstimmt, müssen Sie die \Z
end-of-string anchor verwenden:
def fullmatch(regex, string, flags=0):
"""Emulate python-3.4 re.fullmatch()."""
return re.match("(?:" + regex + r")\Z", string, flags=flags)
Der \A
Anker notwendig ist, nicht da re.match()
bereits das Spiel zu Beginn des Strings verankert.
Hier ist es mein Backporting, die zumindest ein Problem (Dank tim-pietzcker) hat aber erfordert keine erneute Kompilierung Regexes:
import re
def fullmatch(regex, string, flags=0):
"""Emulate python-3.4 re.fullmatch()."""
m = re.match(regex, string, flags=flags)
if m and m.span()[1] == len(string):
return m
Und hier sind einige Testfälle die oben Emulation-Funktion erweisen.
def compare_expansion(regex, s, template):
m1 = re.fullmatch(regex, s)
s1 = m1.expand(template) if m1 else '<NO-MATCH>'
m2 = fullmatch(regex, s)
s2 = m2.expand(template) if m2 else '<NO-MATCH>'
if s1 != s2:
raise AssertionError("\n PY-3: '%s' \n PY-2: '%s' " % (s1, s2))
compare_expansion('.*', 'foo', r'A')
compare_expansion('(.*)', 'foo', r'A_\1')
compare_expansion('(.*)', 'foo', r'A_\g<0>')
compare_expansion('a.*', 'afoo&', r'A')
compare_expansion('a(\w*)', 'afoo&', r'A_\1')
compare_expansion('a(\w*)', 'afoo&', r'A_\g<0>')
## But this fails!
compare_expansion(".*?", "Hello", '\g<0>')
AssertionError:
PY-3: 'A_Hello'
PY-2: '<NO-MATCH>'
Dies schlägt mit Lazy-Quantoren fehl: 're.fullmatch (". *? "," Hello ")' gibt 'None' zurück, wo es eine Übereinstimmung zurückgeben soll. –
Danke für den schnellen Fang! – ankostis
Kann auch '$' verwenden, um bis zum Ende der Zeile zu passen. – gaborous
@gaborous: Das könnte fehlschlagen, da 'regex' einen '(? M)' Modifikator enthalten könnte und dann weniger als der gesamte String zusammenpassen könnte. –