我有一个单词字典,其频率如下。
mydictionary = {'yummy tim tam':3, 'fresh milk':2, 'chocolates':5, 'biscuit pudding':3}
我有一组字符串如下。
recipes_book = "For today's lesson we will show you how to make biscuit pudding using
yummy tim tam and fresh milk."
在上面的字符串中,我有字典中的“饼干布丁”,“美味的蒂姆塔姆”和“新鲜牛奶”。
我目前正在将字符串标记为识别字典中的单词,如下所示。
words = recipes_book.split()
for word in words:
if word in mydictionary:
print("Match Found!")
但它只适用于一个单词字典键。因此,我感兴趣的是以最快的方式(因为我的真实食谱是非常大的文本)来识别具有多个单词的字典键。请帮帮我。
答案 0 :(得分:2)
构建你的正则表达式并编译它。
import re
mydictionary = {'yummy tim tam':3, 'fresh milk':2, 'chocolates':5, 'biscuit pudding':3}
searcher = re.compile("|".join(mydictionary.keys()), flags=re.I | re.S)
for match in searcher.findall(recipes_book):
mydictionary[match] += 1
此后的输出
{'yummy tim tam': 4, 'biscuit pudding': 4, 'chocolates': 5, 'fresh milk': 3}
答案 1 :(得分:1)
根据一些测试," in"键盘工作比#34;更快。模块强>:
What's a faster operation, re.match/search or str.find?
此处的空格没有问题。 假设mydictionary是静态的(预定义的),我认为你应该选择相反的事情:
for key in mydictionary.iterkeys():
if key in recipes_book:
print("Match Found!")
mydictionary[key] += 1
在python2中,使用iterkeys你有一个迭代器,这是一个很好的做法。 使用python3,你可以直接在dict上循环。
答案 2 :(得分:0)
通过搜索要在大块str数据中找到的文本来尝试相反的方法。
import re
for item in mydictionary:
match = re.search(item, recipes_book, flags=re.I | re.S)
if match:
start, end = match.span()
print("Match found for %s between %d and %d character span" % (match.group(0), start, end))