在大写字母处分割字符串
什么是 pythonic 的方法来在一组特定字符出现之前拆分一个字符串?
举个例子,我想把
'TheLongAndWindingRoad'
在每个大写字母出现的地方拆分(可能不包括第一个大写字母),得到
['The', 'Long', 'And', 'Winding', 'Road']
。
补充一下:它还应该能拆分单个字母,比如从
'ABC'
我想得到
['A', 'B', 'C']
。
22 个回答
32
使用前瞻和后顾:
在Python 3.7中,你可以这样做:
re.split('(?<=.)(?=[A-Z])', 'TheLongAndWindingRoad')
这样会得到:
['The', 'Long', 'And', 'Winding', 'Road']
你需要后顾来避免开头出现空字符串。
51
这里有一个不同的正则表达式解决方案。这个问题可以重新表述为“我该如何在每个大写字母前面插入一个空格,然后再进行分割”:
>>> s = "TheLongAndWindingRoad ABC A123B45"
>>> re.sub( r"([A-Z])", r" \1", s).split()
['The', 'Long', 'And', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']
这个方法的好处是可以保留所有非空白字符,而大多数其他解决方案做不到这一点。
202
很遗憾,在Python中不能在零宽匹配的地方进行分割。不过,你可以使用 re.findall
来实现类似的功能:
>>> import re
>>> re.findall('[A-Z][^A-Z]*', 'TheLongAndWindingRoad')
['The', 'Long', 'And', 'Winding', 'Road']
>>> re.findall('[A-Z][^A-Z]*', 'ABC')
['A', 'B', 'C']