Backport Python 3.4's regular expression “fullmatch()” to Python 2

前端 未结 2 1032
陌清茗
陌清茗 2020-12-17 19:22

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

Has anyone back-ported this new method to older Python versions?

2条回答
  •  囚心锁ツ
    2020-12-17 20:12

    Here it is my backporting, which has at least one problem (thanks tim-pietzcker) but does not require recompiling 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
    

    And here are some test-cases proving the above emulation-function.

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

提交回复
热议问题