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

时间:2015-12-16 16:41:49

标签: 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']

如何使用Python重新划分小写字符和大写字符边框的字符串?

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

1 个答案:

答案 0 :(得分:9)

根据re.split

  

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

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

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

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

<强>更新

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

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

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