为什么是re.findall()
仅显示第一个表达式 ( ex1
) 的单个 匹配项,但第二个表达式 ( ex2
) 的两个匹配项。我预计这两种情况都会有两个匹配,因为它们对于这种情况似乎是等效的。
这是代码:
#!/usr/bin/env python
import re
# first expression (no leading new line)
ex1 = '''\
ipv4: {{ var1 }}
timestamp: {{ var2 }}
'''
# second expression, prepended '#\n'
ex2 = '#\n' + ex1
re1 = re.compile(r'{{\s*.+\s*}}')
# Why are they different?
print(re1.findall(ex1, re.M)) # 1 match
print(re1.findall(ex2, re.M)) # 2 matches
#assert re1.findall(ex1, re.M) == re1.findall(ex2, re.M)
这是输出。 python2和python3是一样的:
['{{ var2 }}']
['{{ var1 }}', '{{ var2 }}']
最佳答案
我错误地使用了re.M
,这是更正后的代码。非常感谢 [@Wictor][1] 指出了这一点。此外,其他一些人指出根本不需要 re.M
。谢谢大家。
#!/usr/bin/env python
import re
ex1 = '''\
ipv4: {{ var1 }}
timestamp: {{ var2 }}
'''
ex2 = '#\n' + ex1
re1 = re.compile(r'{{\s*.+\s*}}')
print(re1.findall(ex1)) # 2 matches
print(re1.findall(ex2)) # 2 matches
assert re1.findall(ex1, re.M) == re1.findall(ex2, re.M)
输出:
['{{ var1 }}', '{{ var2 }}']
['{{ var1 }}', '{{ var2 }}']
关于python - 为什么相同正则表达式的 python re.findall() 对于两个等效的输入字符串产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53309940/