Как разделить строку с несколькими разделителями слов в Python? - PullRequest
0 голосов
/ 09 мая 2019

Я хочу эффективный способ разбить список строк, используя список слов в качестве разделителей. В результате получается еще один список строк.

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

Вот входные данные:

words = ["hello my name is jolloopp", "my jolloopp name is hello"]
splitters = ['my', 'is']

Я хочу, чтобы вывод был

final_list = ["hello ", " name ", " jolloopp", " jolloopp name ", " hello"]

Обратите внимание на пробелы.

Также возможно иметь что-то вроде

draft_list = [["hello ", " name ", " jolloopp"], [" jolloopp name ", " hello"]]

, который можно сплющить, используя что-то вроде numpy reshape(-1,1), чтобы получить final_list, но идеальный случай -

ideal_list = ["hello", "name", "jolloopp", "jolloopp name", "hello"]

где пробелы были удалены, что аналогично использованию .strip().

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

Использование re.split не работает полностью, если разделители слов являются частью других слов.

words = ["hellois my name is myjolloopp", "my isjolloopp name is myhello"]
splitters = ['my', 'is']

тогда вывод будет

['hello', '', 'name', '', 'jolloopp', '', 'jolloopp name', '', 'hello']

когда это должно быть

['hellois', 'name', 'myjolloopp', 'isjolloopp name', 'myhello']

Это известная проблема с решениями, использующими re.split.

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

[x.strip() for x in re.split(' | '.join(splitters), ''.join(words))]

не работает должным образом при вводе

words = ["hello world", "hello my name is jolloopp", "my jolloopp name is hello"]

Выход становится

['hello worldhello', 'name', 'jolloopp', 'jolloopp name', 'hello']

когда вывод должен быть

['hello world', 'hello', 'name', 'jolloopp', 'jolloopp name', 'hello']

1 Ответ

3 голосов
/ 09 мая 2019

Вы можете использовать re как,

Обновлен, используя лучший способ, предложенный @pault, используя границы слов \b вместо :space:,

>>> import re
>>> words = ['hello world', 'hello my name is jolloopp', 'my jolloopp name is hello']

# Iterate over the list of words and then use the `re` to split the strings,
>>> [z for y in (re.split('|'.join(r'\b{}\b'.format(x) for x in splitters), word) for word in words) for z in y]
['hello world', 'hello ', ' name ', ' jolloopp', '', ' jolloopp name ', ' hello']
...