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

У меня есть веревочка. Теперь я хочу разбить строку на части, если что-то соответствует из двух разных списков. Как мне это сделать ? вот что у меня есть.

dummy_word = "I have a HTML file"
dummy_type = ["HTML","JSON","XML"]
dummy_file_type = ["file","document","paper"]

for e in dummy_type:
    if e in dummy_word:
        type_found = e
        print("type ->" , e)
        dum = dummy_word.split(e)
        complete_dum = "".join(dum)

        for c in dummy_file_type:
            if c in complete_dum:
                then = complete_dum.split("c")
                print("file type ->",then)

В данном сценарии мой ожидаемый результат["I have a", "HTML","file"]

# arrays list re
Источник
  • 0
    Что, если строка содержит несколько dummy_type или dummy_file_type например 'This HTML file is also an XML document' , или вы уверены, что такого типа ввода никогда не будет?
  • 0
    Элементы из этих списков должны быть разделены по отдельности, остальные должны быть вместе. в данном примере ожидаемый результат: ["This" ,"HTML" ,"file" ,"is also an", "XML"," document]"
Codelisting
за 1 против
Лучший ответ

С такими задачами довольно хорошо справляются itertools.groupby() . Здесь ключ будет переводиться в отдельные слова, если слова находятся в наборе слов, илиFalse если это не так. Это позволяет всем неспециальным словам группироваться вместе, а каждое специальное слово становится отдельным элементом:

from itertools import groupby

dummy_word = "I have a HTML file"
dummy_type = ["HTML","JSON","XML"]
dummy_file_type = ["file","document","paper"]

words = set(dummy_type).union(dummy_file_type)

[" ".join(g) for k, g in 
 groupby(dummy_word.split(), key=lambda word: (word in words) and word)]

# ['I have a', 'HTML', 'file']
за 1 против

Еще один способ использованияre :

>>> list(map(str.strip, re.sub("|".join(dummy_type + dummy_file_type), lambda x: "," + x.group(), dummy_word).split(',')))
['I have a', 'HTML', 'file']
>>> 

Сначала сформируйте шаблон регулярного выражения, объединив все типы с помощьюjoin . С использованиемre.sub , строка заменяется там, где перед токенами ставится запятая, а затем мы разделяем строку с помощью разделителя запятой.map используется для удаления пробелов.

за 1 против

Это сработало для меня:

dummy_word = "I have a HTML file"
dummy_type = ["HTML","JSON","XML"]
dummy_file_type = ["file","document","paper"]

temp = ""
dummy_list = []
for word in dummy_word.split():
    if word in dummy_type or word in dummy_file_type:
        if temp:
            dummy_list.append(temp)
            print(temp, "delete")

        print(temp)
        new_word = word + " "
        dummy_list.append(new_word)
        temp = ""
    else:
        temp += word + " "
    print(temp)
print(dummy_list)
Codelisting
Популярные категории
На заметку программисту