Выход:

я есть словарь слов с их частотами следующим образом.

mydictionary = {'yummy tim tam':3, 'milk':2, 'chocolates':5, 'biscuit pudding':3, 'sugar':2}

У меня есть набор строк (удалены знаки препинания) следующим образом.

recipes_book = "For todays lesson we will show you how to make biscuit pudding using 
yummy tim tam milk and rawsugar"

В приведенной выше строке мне нужно вывести только "бисквитный пудинг", "вкусный тим там" и "молоко", ссылаясь на словарь. НЕ сахар, потому что это сырой сахар.

Тем не менее, код, который я сейчас использую, также выводит сахар.

mydictionary = {'yummy tim tam':3, 'milk':2, 'chocolates':5, 'biscuit pudding':3, 'sugar':2}
recipes_book = "For today's lesson we will show you how to make biscuit pudding using yummy tim tam milk and rawsugar"
searcher = re.compile(r'{}'.format("|".join(mydictionary.keys())), flags=re.I | re.S)

for match in searcher.findall(recipes_book):
    print(match)

Как избежать использования таких подстрок и рассматривать только один полный токен, такой как «молоко». Пожалуйста, помогите мне.

 akash karothiya03 окт. 2017 г., 12:21
использовать границу слова\b
 Wiktor Stribiżew03 окт. 2017 г., 14:15
Почему вы приняли ответ, если он не работает для вас? Обновите вопрос, поскольку это та же проблема, что и выописано здесь, Границы слова являются лишь частью решения здесь.

Ответы на вопрос(3)

Еще один способ использованияre.escape, Больше информации относительноснова здесь !!!

import re

mydictionary = {'yummy tim tam':3, 'milk':2, 'chocolates':5, 'biscuit pudding':3, 'sugar':2}
recipes_book = "For today's lesson we will show you how to make biscuit pudding using yummy tim tam milk and rawsugar"

val_list = []

for i in mydictionary.keys():
    tmp_list = []
    regex_tmp = r'\b'+re.escape(str(i))+r'\b'
    tmp_list = re.findall(regex_tmp,recipes_book)
    val_list.extend(tmp_list)

print val_list

Выход:

"C:\Program Files (x86)\Python27\python.exe" C:/Users/punddin/PycharmProjects/demo/demo.py
['yummy tim tam', 'biscuit pudding', 'milk']
Решение Вопроса

mydictionary = {'yummy tim tam':3, 'milk':2, 'chocolates':5, 'biscuit pudding':3, 'sugar':2}
recipes_book = "For today's lesson we will show you how to make biscuit pudding using yummy tim tam milk and rawsugar"
searcher = re.compile(r'{}'.format("|".join(map(lambda x: r'\b{}\b'.format(x), mydictionary,.keys()))), flags=re.I | re.S)

for match in searcher.findall(recipes_book):
    print(match)

Выход:

biscuit pudding
yummy tim tam
milk
 Wiktor Stribiżew03 окт. 2017 г., 12:31
Вы также можете удалитьre.S как это не имеет никакого значения.

\ b'. Простыми словами

recipes_book = "For todays lesson we will show you how to make biscuit pudding using 
yummy tim tam milk and rawsugar"

>>> re.findall(r'(?is)(\bchocolates\b|\bbiscuit pudding\b|\bsugar\b|\byummy tim tam\b|\bmilk\b)',recipes_book)
['biscuit pudding', 'yummy tim tam', 'milk']
 akash karothiya03 окт. 2017 г., 12:32
Я просто иллюстрирую использование\b границы слова здесь, вы можете редактировать соответственно, просто проверьте ответ @Delimitry :)
 user856632303 окт. 2017 г., 12:28
Без жесткого кодирования мои словарные ключи вre.findall Есть ли простой способ сделать это?

Ваш ответ на вопрос