Как разбить строки на основе списка глоссариев? - PullRequest
0 голосов
/ 14 января 2019

Приведен список глоссариев:

glossaries = ['USA', '34']

Цель состоит в том, чтобы использовать элементы внутри глоссариев и разбивать строку, используя глоссарии в качестве разделителей. Например. учитывая строку и глоссарии, функция _isolate_glossaries():

glossaries = ['USA', '34']
word = '1934USABUSA'
_isolate_glossaries(word, glossaries)

должен вывести:

['19', '34', 'USA', 'B', 'USA']

Я пробовал:

def isolate_glossary(word, glossary):
    print(word, glossary)
    # Check that word == glossary and glossary not in word
    if re.match('^{}$'.format(glossary), word) or not re.search(glossary, word):
        return [word]
    else:
        segments = re.split(r'({})'.format(glossary), word)
        segments, ending = segments[:-1], segments[-1] # Remove the last catch with null string.
        return segments

def _isolate_glossaries(word, glossaries):
    word_segments = [word]
    for gloss in glossaries:
        word_segments = [out_segment
                         for segment in word_segments 
                         for out_segment in isolate_glossary(segment, gloss)] 
    return word_segments

Это работает, но выглядит слишком запутанным, чтобы иметь столько уровней разбиения циклов и регулярных выражений. Есть ли лучший способ разбить строку на основе глоссариев?

1 Ответ

0 голосов
/ 14 января 2019

Чтобы разделить строку по элементам в списке, создайте регулярное выражение на лету, включая элементы, разделенные трубкой |, все заключенные в группу захвата (группа без захвата не включает сами элементы в выход):

list = re.split('({})'.format('|'.join(glossaries)), word);
print ([x for x in list if x]) # filter non-word items

Смотрите демо здесь

...