为什么Python的`re.split()`在零长度匹配上不分裂?

Tim*_*ker 16 python regex

rePython中的一个特别怪异的(非常强大的)模块是re.split() 永远不会在零长度匹配上拆分字符串,例如,如果我想沿着字边界分割字符串:

>>> re.split(r"\s+|\b", "Split along words, preserve punctuation!")
['Split', 'along', 'words,', 'preserve', 'punctuation!']
Run Code Online (Sandbox Code Playgroud)

代替

['', 'Split', 'along', 'words', ',', 'preserve', 'punctuation', '!']
Run Code Online (Sandbox Code Playgroud)

为什么会有这个限制?它是按设计的吗?其他正则表达式的味道是这样的吗?

int*_*jay 22

这是一个设计决策,可能已经走了.蒂姆·彼得斯这篇文章解释说:

例如,如果你用模式x*分割"abc",你期望什么?模式匹配(长度为0)在4个地方,但我敢打赌大多数人会惊讶得到

['','a','b','c','']

回来而不是(因为他们得到)

[ 'ABC']

有些人不同意他的意见.由于向后兼容性问题,Guido van Rossum 不希望它改变.他:

我可以添加一个标志来启用此行为.

编辑:

Jan Burgy发布了一个解决方法:

>>> s = "Split along words, preserve punctuation!"
>>> re.sub(r"\s+|\b", '\f', s).split('\f')
['', 'Split', 'along', 'words', ',', 'preserve', 'punctuation', '!']
Run Code Online (Sandbox Code Playgroud)

哪里'\f'可以被任何未使用的角色取代.