Backport Python 3.4的正则表达式“fullmatch()”到Python 2

时间:2015-05-13 10:39:21

标签: python regex python-3.x python-2.x backport

Python 3.4引入了新的正则表达式方法re.fullmatch(pattern, string, flags=0)

有没有人将这种新方法反向移植到较旧的Python版本?

2 个答案:

答案 0 :(得分:18)

要确保整个字符串匹配,您需要使用\Z end-of-string anchor

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

\A锚点不是必需的,因为re.match()已经将匹配锚定到字符串的开头。

答案 1 :(得分:1)

这是我的backporting,它至少有一个问题(感谢tim-pietzcker)但不需要重新编译正则表达式

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

以下是一些证明上述仿真功能的测试用例。

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>'