将 Python 3.4 的正则表达式 "fullmatch()" 反向移植到 Python 2
Backport Python 3.4's regular expression "fullmatch()" to Python 2
Python 3.4引入了新的regex方法re.fullmatch(pattern, string, flags=0)
.
有没有人将这种新方法反向移植到旧的 Python 版本?
这是我的反向移植,它至少有一个问题(感谢 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_')
compare_expansion('(.*)', 'foo', r'A_\g<0>')
compare_expansion('a.*', 'afoo&', r'A')
compare_expansion('a(\w*)', 'afoo&', r'A_')
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>'
要确保整个字符串匹配,您需要使用 \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()
已经将匹配项锚定到字符串的开头。
Python 3.4引入了新的regex方法re.fullmatch(pattern, string, flags=0)
.
有没有人将这种新方法反向移植到旧的 Python 版本?
这是我的反向移植,它至少有一个问题(感谢 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_')
compare_expansion('(.*)', 'foo', r'A_\g<0>')
compare_expansion('a.*', 'afoo&', r'A')
compare_expansion('a(\w*)', 'afoo&', r'A_')
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>'
要确保整个字符串匹配,您需要使用 \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()
已经将匹配项锚定到字符串的开头。