Backport Python 3.4 regex "fullmatch ()" in Python 2

Python 3.4 introduced the new regex method re.fullmatch(pattern, string, flags=0) .

Has anyone turned this new method to older versions of Python?

+6
source share
2 answers

To ensure that the entire string matches, you must use the \Z end-of-string binding:

 def fullmatch(regex, string, flags=0): """Emulate python-3.4 re.fullmatch().""" return re.match("(?:" + regex + r")\Z", string, flags=flags) 

The \A anchor is not needed since re.match() already binds the match to the beginning of the line.

+10
source

Here it is my backporting which has at least one problem (thanks tim-pietzcker ), but does not require recompilation of regular expressions:

 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 

And here are a few test cases confirming the aforementioned emulation function.

 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>' 
+1
source

Source: https://habr.com/ru/post/987124/


All Articles