【问题标题】:Backport Python 3.4's regular expression "fullmatch()" to Python 2将 Python 3.4 的正则表达式“fullmatch()”反向移植到 Python 2
【发布时间】:2015-07-24 14:21:54
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    这是我的反向移植,它至少有一个问题(感谢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>' 
    

    【讨论】:

    • 这会因惰性量词而失败:re.fullmatch(".*?", "Hello") 返回应返回匹配项的 None
    • 感谢您的快速捕捉!
    【解决方案2】:

    要确保整个字符串匹配,您需要使用\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() 已经将匹配锚定到字符串的开头。

    【讨论】:

    • 也可以使用$匹配直到行尾。
    • @gaborous:这可能会适得其反,因为regex 可能包含(?m) 修饰符,然后小于整个字符串可以匹配。
    • r")\Z" 部分是否需要是原始字符串文字,或者这只是您的习惯? Python 2 和 3 都没有以任何特殊方式对待 \Z,所以我认为这不是强制性的,但谁知道...
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2013-07-19
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多