Извлечение всех заглавных слов, следующих друг за другом из строки - PullRequest
0 голосов
/ 07 сентября 2018

Из этой строки "A B c de F G A" Я хотел бы получить следующий список: ["A B", "F G A"]. Это означает, что мне нужно получить все последовательности заглавных слов.

Я пробовал что-то вроде этого:

text = "A B c de F G A"
result = []
for i, word in enumerate(text.split()):
    if word[0].isupper():
        s = ""
        while word[0].isupper():

            s += word
            i += 1
            word = text[i]

        result.append(s)

Но он выдает следующий вывод: ['A', 'BB', 'F', 'G', 'A']

Я полагаю, это происходит, потому что вы не можете пропустить элемент списка, просто увеличивая i. Как я могу избежать этой ситуации и получить правильный вывод?

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Вот решение без itertools или re:

def findTitles(text):
    filtered = " ".join([x if x.istitle() else " " for x in text.split()])
    return [y.strip() for y in filtered.split("  ") if y]

print(findTitles(text="A B c de F G A"))
#['A B', 'F G A']

print(findTitles(text="A Bbb c de F G A"))
#['A Bbb', 'F G A']
0 голосов
/ 07 сентября 2018

Вы можете использовать re.split, чтобы разделить строку с помощью регулярного выражения.

import re

def get_upper_sequences(s):
    return re.split(r'\s+[a-z][a-z\s]*', s)

Пример

>>> get_upper_sequences( "A B c de F G A")
['A B', 'F G A']
0 голосов
/ 07 сентября 2018

Следующий пример извлечет все заглавные слова, следующие друг за другом из строки:

string="A B c de F G A"

import re
[val for val in re.split('[a-z]*',string.strip()) if val != " "]
0 голосов
/ 07 сентября 2018

Вы можете использовать itertools.groupby:

import itertools
s = "A B c de F G A"
new_s = [' '.join(b) for a, b in itertools.groupby(s.split(), key=str.isupper) if a]

Выход:

['A B', 'F G A']
...