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重新划分小写字符和大写字符边框的字符串?
为什么第一行无效,而第二行效果不错?
答案 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
标志以启用零长度匹配行为。