Разделите строку в прописных буквах

Что pythonic путь состоит в том, чтобы разделить строку перед случаями данного набора символов?

Например, я хочу разделить 'TheLongAndWindingRoad' при любом возникновении прописной буквы (возможно кроме первого), и получают ['The', 'Long', 'And', 'Winding', 'Road'].

Править: Это должно также разделить отдельные проявления, т.е. от 'ABC' Я хотел бы получить ['A', 'B', 'C'].

80
задан Filipp W. 10 December 2018 в 11:46
поделиться

6 ответов

К сожалению, в 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']
120
ответ дан 24 November 2019 в 09:51
поделиться
import re
filter(None, re.split("([A-Z][^A-Z]*)", "TheLongAndWindingRoad"))

или

[s for s in re.split("([A-Z][^A-Z]*)", "TheLongAndWindingRoad") if s]
4
ответ дан 24 November 2019 в 09:51
поделиться

Вариант решения @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
6
ответ дан 24 November 2019 в 09:51
поделиться
>>> 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 '] *"

18
ответ дан 24 November 2019 в 09:51
поделиться

Вот альтернативное решение для регулярного выражения. Проблема может быть переформулирована как «как мне вставить пробел перед каждой прописной буквой, прежде чем выполнять разделение»:

>>> s = "TheLongAndWindingRoad ABC A123B45"
>>> re.sub( r"([A-Z])", r" \1", s).split()
['The', 'Long', 'And', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']

Это имеет то преимущество, что сохраняет все непробельные символы, чего нет в большинстве других решений.

27
ответ дан 24 November 2019 в 09:51
поделиться

Альтернативное решение (если вам не нравятся явные 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
2
ответ дан 24 November 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: