соответствие конкретного слова со строками в списке. полностью соответствует и не частично

1
delete = ["man", "eat"]

item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']

Мой код:

lst = []
for x in item_list:
    if not any(y in x for y in delete):
        lst.append([x, x])

print(lst)

Тем не менее, этот метод сделает мой вывод очень затруднительным. Например, если мое удаление содержит delete = ["man", "eat"], которое не похоже на слово "eater" в item_list, но все же программа будет принимать его, поскольку я использую, если не любой (y IN x) это "в" вернет true, потому что еда содержит внутри едока, но то, что я хотел, не содержит внутри слова, а соответствует. Я хотел бы совместить слово "пожиратель" с людоедом и человеком с человеком, а не есть для людоеда и мамы человеку.

Есть ли способ сделать полное совпадение, а не частично? Мой текущий код частично совпадает, что является неправильным, когда у меня есть много частичных слов в delete.

Теги:

4 ответа

1

Затем вы можете проверить точное соответствие строк:

    delete = ["man", "eat"]

    item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']


    lst = []
    for x in item_list:
        if not any(y == x for y in delete):
            lst.append([x, x])

    print(lst)


#  [['sharper_task|$none_venue|man', 'sharper_task|$none_venue|man'], ['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]

Примечание: or | оператор не может быть использован внутри строки, как в 'sharper_task|eater_venue|todo'.

  • 0
    Есть ли способ разделить "sharper_task | man_venue-1_0_king" на "резче", "", "задача", "|", "человек", "", "место встречи", "-", "1", "" , "0", "", "царь"?
  • 0
    @ Новичок, можете ли вы опубликовать ожидаемый результат?
1

Вы можете разделить строки на | в подстроки сначала перед использованием оператора in чтобы проверить, находятся ли элементы в delete в одной из подстрок, далее разделенных на предыдущие подстроки с помощью _:

lst = []
for x in item_list:
    if not any(y in s.split('_') for s in x.split('|') for y in delete):
        lst.append([x, x])
print(lst)

Эти результаты:

[['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]

  • 0
    Правда, но сейчас человек тоже в выходной. «человек» не должен быть внутри выхода.
  • 0
    Есть ли способ разделить "sharper_task | man_venue-1_0_king" на "резче", " ", "задача", "|", "человек", " ", "место встречи", "-", "1", " " , "0", " ", "король"?
Показать ещё 1 комментарий
0

Попробуйте ниже -

import re

del_list = ["man", "eat"]
regex = '|'.join([r'\b' + y + r'\b' for y in del_list])

item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']

lst = []
for x in item_list:
  if not re.search(regex, x):
      lst.append([x, x])

print(lst)

Результат этого -

[['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]

Использование одного регулярного выражения, а не списка, гарантирует, что совпадение для каждого элемента "быть удаленным" не вводит элемент item_list в выходной список, который был удален предыдущим элементом "для удаления".

Regex = '|'.join() - Здесь он создает регулярное выражение, используя raw (r '') строки с '\ b', чтобы соответствовать границам слов (обозначенным не-буквенно-цифровыми символами). Подробнее об этом читайте здесь.

Если мы используем 2 для циклов один для del_list, а другой для item_list, то результат будет выглядеть так, как показано ниже, что, по моему мнению, неверно, поскольку список "человек" все еще появляется один раз из-за "съедания", который не соответствует. Остальные элементы, которые не совпадали даже с одним из del_list, появляются дважды -

[['sharper_task|$none_venue|man', 'sharper_task|$none_venue|man'], ['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]
  • 0
    Есть ли способ разделить "sharper_task | man_venue-1_0_king" на "резче", "", "задача", "|", "человек", "", "место встречи", "-", "1", "" , "0", "", "царь"?
  • 0
    Логика для этого может состоять в том, чтобы заменить все подчеркивания '_' на пробел, все '|' с '| ', all' - 'with' - ', а затем разбить полученную строку на один пробел. Не знаете, почему вы хотите, чтобы _ было пустой строкой? Вы должны попробовать это, а затем опубликовать еще один вопрос, если он не работает.
0

Предполагая, что вы хотите разделить на характер трубы,

delete = ["man", "eat"]

item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']

lst = [item 
       for item in item_list 
       if any(word in item.split('|') for word in delete)]
  • 0
    Есть ли способ разделить "sharper_task | man_venue-1_0_king" на "резче", "", "задача", "|", "человек", "", "место встречи", "-", "1", "" , "0", "", "царь"?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню