在出现给定字符集之前拆分字符串的pythonic方法是什么?
例如,我想拆分
'TheLongAndWindingRoad'
在出现大写字母(可能是首字母除外)时,获得
['The', 'Long', 'And', 'Winding', 'Road']。
编辑:它也应该拆分单个事件,即
我想从'ABC'获得
['A', 'B', 'C']。
不幸的是,在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']
请注意,这会删除第一个大写字母之前的所有字符。 theLongAndWindingRoad将导致[Long,And,Winding,Road]
@MarcSchulder:如果需要这种情况,只需使用[a-zA-Z][^A-Z]*作为正则表达式。
是否可以在不使用大写字母的情况下执行相同的操作?
为了拆分小写的驼峰词print(re.findall(^[a-z]+|[A-Z][^A-Z]*, theLongAndWindingRoad))
这是另一种正则表达式解决方案。可以将问题改写为"在拆分之前,如何在每个大写字母之前插入空格":
>>> s ="TheLongAndWindingRoad ABC A123B45"
>>> re.sub( r"([A-Z])", r" \1", s).split()
['The', 'Long', 'And', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']
这样做的优点是保留了所有非空白字符,而大多数其他解决方案则没有。
您能否解释 1之前的空格为什么起作用?是因为split方法还是与正则表达式有关?
>>> import re
>>> re.findall('[A-Z][a-z]*', 'TheLongAndWindingRoad')
['The', 'Long', 'And', 'Winding', 'Road']
>>> re.findall('[A-Z][a-z]*', 'SplitAString')
['Split', 'A', 'String']
>>> re.findall('[A-Z][a-z]*', 'ABC')
['A', 'B', 'C']