Разделить строку на основе заданных слов из списка - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь найти способ разбить строку, основываясь только на заданных словах.

Также новый список должен соответствовать порядку слов из исходной строки (текста)

Несколько примеров ниже :

def split_str_from_words(words, text):
    return ???

split_str_from_words(["hello", "world"], "helloworldhello")
split_str_from_words(["hello"], "helloworldhowareyouhello")
split_str_from_words(["hello", "how", "are", "you", "world"], "helloworldhowareyouhello")

Основываясь на 3 приведенных выше примерах, функция должна вернуть:

["hello", "world", "hello"]
["hello", "worldhowareyou", "hello"]
["hello", "world", "how", "are", "you", "hello"]

Понятия не имею, как это сделать (я пробовал с такими функциями, как split, но пока что ничего не работает, как ожидалось.

У меня есть идея, как создать свой собственный алгоритм, но мне интересно, есть ли какие-нибудь встроенные функции, которые я могу использовать для этого случая.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

До сих пор я был в состоянии обнаружить все мои слова вхождение / позиция / длина слова

Это может быть очень полезно, чтобы сохранить порядок слов и фрагмента строки.

import re

def split_str_from_words(words, text):
    for word in words:
        positions = [m.start() for m in re.finditer(word, text)]
        print(word, positions, len(positions), len(word))

    return ""

1 Ответ

1 голос
/ 06 апреля 2020

Для предложенного примера, re.split должно объединить все слова, которые будут сопоставлены с |.

def split_str_from_words(l, s):
    m = re.split(rf"({'|'.join(l)})", s)
    return [i for i in m if i] # removes empty strings (improvements are welcome)

import re

split_str_from_words(["hello", "world"], "helloworldhello")
# ['hello', 'world', 'hello']

split_str_from_words(["hello"], "helloworldhowareyouhello")
# ['hello', 'worldhowareyou', 'hello']

split_str_from_words(["hello", "how", "are", "you", "world"], "helloworldhowareyouhello")
# ['hello', 'world', 'how', 'are', 'you', 'hello']
...