Python 2.7.1 re模块中re.split函数与re.DOTALL标志的bug
我有一台运行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
。