我在调试一些遗留代码,发现我们没有正确使用re.findall。
所以我有一组关键字(也可以是一个短语),我需要返回一个句子中出现的所有关键字。
keyWords = [keyword1, keyword2,...] # size around ~500
prog = re.compile(r'\b(%s)\b'%"|".join(keyWords)) # has to match the entire word, hence the word boundary \b
prog.findall(sentence)
但它在以下情况下不起作用:
myKeywords = [A, A B]
mySentence = [A B]
"findall“将只返回A,因为它是非重叠搜索。
然后,我又回到了使用re.search的残暴状态:
set(filter(lambda x: bool(re.search(r'\b(%s)\b'%x, sentence)), keyWords))
但是性能太慢了。使用大约500个关键词和不到10个单词的句子,残暴的力量需要10^-2秒,而findall只需要10^-4秒。正则表达式编译确实需要10^-2秒,但是超过100万个句子时,可以忽略它。
有没有什么内置的方法或者更快的方法来做到这一点?
再想一想:
经过进一步的调查,我认为这与重叠或非重叠搜索无关,也就是说,即使是非重叠搜索,也不会对问题有所帮助。这更像是一个在句子中查找所有短语(短语可以是另一个短语的子串)的问题。
发布于 2018-07-10 06:41:53
我想你想要最长的匹配。
要做到这一点,您可以按大小逆序排序关键字(最长的第一个)
import re
keywords = ['a', 'b', 'a b']
keywords.sort(key=lambda k: len(k), reverse=True)
regex = r'\b{0}\b'.format('|'.join(keywords))
findall_kw = re.compile(regex).findall
例如:
sentence = 'a, a b'
print(findall_kw(sentence))
你会得到:
['a', 'a b']
注意:如果您的关键字可以包含特殊字符,则可以考虑使用re.escape()对其进行转义。
https://stackoverflow.com/questions/51254037
复制相似问题