Backport Python 3.4’s expresión regular “fullmatch ()” a Python 2

Python 3.4 introdujo el nuevo método regex re.fullmatch(pattern, string, flags=0) .

¿Alguien ha implementado este nuevo método en versiones anteriores de Python?

Para asegurarse de que la cadena completa coincida, debe usar el anclaje de fin de cadena \Z :

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

El anclaje \A no es necesario ya que re.match() ya ancla la coincidencia al inicio de la cadena.

Aquí está mi backporting, que tiene al menos un problema (gracias a tim-pietzcker ) pero no requiere la recomstackción de expresiones regulares :

 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 

Y aquí hay algunos casos de prueba que prueban la función de emulación anterior.

 def compare_expansion(regex, s, template): m1 = re.fullmatch(regex, s) s1 = m1.expand(template) if m1 else '' m2 = fullmatch(regex, s) s2 = m2.expand(template) if m2 else '' 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: ''