我有一个可以长任意的字符串
s = 'Choose from millions of possibilities on Shaadi.com. Create your profile, search&contact; your special one.RegisterFree\xa0\xa0\xa0unsubscribing reply to this mail\xa0\n and 09times and this is limited time offer! and this is For free so you are saving cash'
我有一个垃圾字的列表,可能就像
p_words = ['cash', 'for free', 'limited time offer']
我想知道输入文本中是否存在模式以及有多少次?
只有一个单词时变得简单
import re
p = re.compile(''.join[p_words]) # correct me if I am wrong here
m = p.match(s)
但它可能是bi-gram, tri-gram or n-gram
我们如何处理这个问题?
答案 0 :(得分:4)
p = re.compile('|'.join(re.escape(w) for w in p_words))
然后 p
将匹配p_words
中的任何字符串。
答案 1 :(得分:2)
如果文字和单词数量不是很大,您可以从example开始:
d = {w: s.count(w) for w in p_words if w in s}
# -> {'cash': 1, 'limited time offer': 1}
您可以将其效果与以下内容进行比较:
import re
from collections import Counter
p = re.compile('|'.join(map(re.escape, p_words)))
d = Counter(p.findall(s))
# -> Counter({'limited time offer': 2, 'cash': 2})
供参考,将其速度与fgrep
进行比较。它应该快速匹配输入流中的多个字符串:
$ grep -F -o -f patternlist.txt largetextfile.txt | sort | uniq -c
2 cash
2 limited time offer
答案 2 :(得分:1)
正则表达式使用'|'分隔器。在每种情况下用'\ W +'替换空格,它与非字母相匹配,我认为你很高兴。