Что 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']
import re
filter(None, re.split("([A-Z][^A-Z]*)", "TheLongAndWindingRoad"))
или
[s for s in re.split("([A-Z][^A-Z]*)", "TheLongAndWindingRoad") if s]
Вариант решения @ChristopheD
s = 'TheLongAndWindingRoad'
pos = [i for i,e in enumerate(s+'A') if e.isupper()]
parts = [s[pos[j]:pos[j+1]] for j in xrange(len(pos)-1)]
print parts
>>> 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']
Если вы хотите, чтобы "It'sATest"
разбивался на ["It's", 'A', 'Test' ]
изменить rexeg на "[AZ] [a-z '] *"
Вот альтернативное решение для регулярного выражения. Проблема может быть переформулирована как «как мне вставить пробел перед каждой прописной буквой, прежде чем выполнять разделение»:
>>> s = "TheLongAndWindingRoad ABC A123B45"
>>> re.sub( r"([A-Z])", r" \1", s).split()
['The', 'Long', 'And', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']
Это имеет то преимущество, что сохраняет все непробельные символы, чего нет в большинстве других решений.
Альтернативное решение (если вам не нравятся явные regexes):
s = 'TheLongAndWindingRoad'
pos = [i for i,e in enumerate(s) if e.isupper()]
parts = []
for j in xrange(len(pos)):
try:
parts.append(s[pos[j]:pos[j+1]])
except IndexError:
parts.append(s[pos[j]:])
print parts