在大写字母处分割字符串

146 投票
22 回答
152120 浏览
提问于 2025-04-15 19:22

什么是 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']

撰写回答