Python re不能拆分零宽度锚点?

Boo*_*ter 7 python regex

import re

s = 'PythonCookbookListOfContents'

# the first line does not work
print re.split('(?<=[a-z])(?=[A-Z])', s ) 

# second line works well
print re.sub('(?<=[a-z])(?=[A-Z])', ' ', s)

# it should be ['Python', 'Cookbook', 'List', 'Of', 'Contents']
Run Code Online (Sandbox Code Playgroud)

如何使用Python re从小写字符和大写字符的边框拆分字符串?

为什么第一行无效,而第二行效果不错?

fal*_*tru 9

根据re.split:

请注意,拆分永远不会在空模式匹配上拆分字符串.例如:

>>> re.split('x*', 'foo')
['foo']
>>> re.split("(?m)^$", "foo\n\nbar\n")
['foo\n\nbar\n']
Run Code Online (Sandbox Code Playgroud)

怎么用re.findall呢?(而不是专注于分隔符,专注于你想要的项目.)

>>> import re
>>> s = 'PythonCookbookListOfContents'
>>> re.findall('[A-Z][a-z]+', s)
['Python', 'Cookbook', 'List', 'Of', 'Contents']
Run Code Online (Sandbox Code Playgroud)

UPDATE

使用regex模块(替代正则表达式模块,替换re),可以拆分零宽度匹配:

>>> import regex
>>> s = 'PythonCookbookListOfContents'
>>> regex.split('(?<=[a-z])(?=[A-Z])', s, flags=regex.VERSION1)
['Python', 'Cookbook', 'List', 'Of', 'Contents']
Run Code Online (Sandbox Code Playgroud)

注意:指定regex.VERSION1标志以启用零拆分长度匹配行为.