为什么对于同一个正则表达式,python re.findall()对于两个等效的输入字符串会产生不同的结果?

时间:2018-11-14 22:54:02

标签: python regex

为什么re.findall()仅显示第一个表达式(ex1单个匹配项,而第二个表达式({{ 1}})。我预计这两种情况都将有两次匹配,因为在这种情况下它们看起来是相同的。

代码如下:

ex2

这是输出。 python2和python3相同:

#!/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)

1 个答案:

答案 0 :(得分:0)

我没有正确使用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 }}']