首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python中重叠的findall

python中重叠的findall
EN

Stack Overflow用户
提问于 2018-07-10 05:06:44
回答 1查看 141关注 0票数 0

我在调试一些遗留代码,发现我们没有正确使用re.findall。

所以我有一组关键字(也可以是一个短语),我需要返回一个句子中出现的所有关键字。

代码语言:javascript
复制
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)

但它在以下情况下不起作用:

代码语言:javascript
复制
myKeywords = [A, A B]
mySentence = [A B]

"findall“将只返回A,因为它是非重叠搜索。

然后,我又回到了使用re.search的残暴状态:

代码语言:javascript
复制
set(filter(lambda x: bool(re.search(r'\b(%s)\b'%x, sentence)), keyWords))

但是性能太慢了。使用大约500个关键词和不到10个单词的句子,残暴的力量需要10^-2秒,而findall只需要10^-4秒。正则表达式编译确实需要10^-2秒,但是超过100万个句子时,可以忽略它。

有没有什么内置的方法或者更快的方法来做到这一点?

再想一想:

经过进一步的调查,我认为这与重叠或非重叠搜索无关,也就是说,即使是非重叠搜索,也不会对问题有所帮助。这更像是一个在句子中查找所有短语(短语可以是另一个短语的子串)的问题。

EN

回答 1

Stack Overflow用户

发布于 2018-07-10 06:41:53

我想你想要最长的匹配。

要做到这一点,您可以按大小逆序排序关键字(最长的第一个)

代码语言:javascript
复制
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

例如:

代码语言:javascript
复制
sentence = 'a, a b'
print(findall_kw(sentence))

你会得到:

代码语言:javascript
复制
['a', 'a b']

注意:如果您的关键字可以包含特殊字符,则可以考虑使用re.escape()对其进行转义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51254037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档