Python 2.7.1 re模块中re.split函数与re.DOTALL标志的bug

7 投票
1 回答
1679 浏览
提问于 2025-04-17 06:09

我有一台运行Lion系统的Mac,使用的是Python 2.7.1。我发现re模块有些奇怪的地方。如果我运行以下这行代码:

print re.split(r'\s*,\s*', 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r')

我得到的结果是:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']

但是如果我加上re.DOTALL这个标志,像这样运行:

print re.split(r'\s*,\s*', 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r', re.DOTALL)

那么我得到的结果是:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q, r']

注意到这里的'q, r'被算作一个匹配,而不是两个。

这是为什么呢?我不明白如果我的模式里没有点(.),re.DOTALL这个标志为什么会有影响。我是做错了什么,还是说这有什么bug?

1 个回答

13
>>> s = 'a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r'
>>> re.split(r'\s*,\s*', s)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']
>>> re.split(r'\s*,\s*', s, maxsplit=16)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q, r']
>>> re.split(r'\s*,\s*', s, flags=re.DOTALL)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']

问题在于你把 re.DOTALL 作为位置参数传递了,这样它就会把 maxsplit=0 这个参数设置成 re.DOTALL,而不是 flags=0。实际上,re.DOTALL 是一个常量,它的值是 16

撰写回答