Разбить строку на заглавные буквы - PullRequest
72 голосов
/ 17 февраля 2010

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

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

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

Ответы [ 14 ]

0 голосов
/ 26 марта 2019

Поделиться тем, что пришло в голову, когда я прочитал пост. Отличается от других постов.

strs = 'TheLongAndWindingRoad'

# grab index of uppercase letters in strs
start_idx = [i for i,j in enumerate(strs) if j.isupper()]

# create empty list
strs_list = []

# initiate counter
cnt = 1

for pos in start_idx:
    start_pos = pos

    # use counter to grab next positional element and overlook IndexeError
    try:
        end_pos = start_idx[cnt]
    except IndexError:
        continue

    # append to empty list
    strs_list.append(strs[start_pos:end_pos])

    cnt += 1
0 голосов
/ 27 апреля 2018

Замените каждую заглавную букву «L» в данном поле пробелом плюс букву «L». Мы можем сделать это, используя понимание списка, или мы можем определить функцию для этого следующим образом.

s = 'TheLongANDWindingRoad ABC A123B45'
''.join([char if (char.islower() or not char.isalpha()) else ' '+char for char in list(s)]).strip().split()
>>> ['The', 'Long', 'A', 'N', 'D', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']

Если вы выбрали функцию, вот как.

def splitAtUpperCase(text):
    result = ""
    for char in text:
        if char.isupper():
            result += " " + char
        else:
            result += char
    return result.split()

В случае данного примера:

print(splitAtUpperCase('TheLongAndWindingRoad')) 
>>>['The', 'Long', 'A', 'N', 'D', 'Winding', 'Road']

Но большую часть времени, когда мы разбиваем предложение на заглавные буквы, обычно мы хотим сохранить сокращения, которые обычно представляют собой непрерывный поток заглавных букв. Код ниже поможет.

def splitAtUpperCase(s):
    for i in range(len(s)-1)[::-1]:
        if s[i].isupper() and s[i+1].islower():
            s = s[:i]+' '+s[i:]
        if s[i].isupper() and s[i-1].islower():
            s = s[:i]+' '+s[i:]
    return s.split()

splitAtUpperCase('TheLongANDWindingRoad')

>>> ['The', 'Long', 'AND', 'Winding', 'Road']

Спасибо.

0 голосов
/ 10 февраля 2016

Альтернативный способ с использованием enumerate и isupper()

Код:

strs = 'TheLongAndWindingRoad'
ind =0
count =0
new_lst=[]
for index, val in enumerate(strs[1:],1):
    if val.isupper():
        new_lst.append(strs[ind:index])
        ind=index
if ind<len(strs):
    new_lst.append(strs[ind:])
print new_lst

Выход:

['The', 'Long', 'And', 'Winding', 'Road']
0 голосов
/ 07 декабря 2014

Альтернативный способ без использования регулярных выражений или перечислений:

word = 'TheLongAndWindingRoad'
list = [x for x in word]

for char in list:
    if char != list[0] and char.isupper():
        list[list.index(char)] = ' ' + char

fin_list = ''.join(list).split(' ')

Я думаю, что все яснее и проще, если не использовать слишком много методов или использовать длинные списки, которые трудно читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...