Python中的正则表达式是否太慢?

时间:2016-07-18 09:25:30

标签: python regex

我在文件中有一组句子(比如500)。我试图找出任何句子中是否存在一对单词(例如word1word2)。我有58000个这样的单词。

例如,让句子集为:

I am a good boy. He is a bad boy. I am a very good boy.

要搜索的一对词:

amgood

所以这应该返回第一个和最后一个句子作为输出。

我正在使用以下正则表达式:

for match in re.finditer(r'([ A-Za-z0-9]*)\b{string1}\b([^\.!?]*)\b{string2}\b([^\.!?]*[\.!?])'.format(string1=word1, string2=word2), sentence_set.lower(), re.S):

此声明正在开展工作,但需要花费大量时间;超过 8 分钟。

然后我删除了正则表达式部分并使用了多个循环并拆分每个句子,然后检查这两个单词是否存在。这花费的时间少得多,少于 2分钟

所以,我觉得正则表达式有时很慢。真的吗 ?有没有办法提高速度?

2 个答案:

答案 0 :(得分:4)

你说你有500个句子和58000个单词对,这意味着你打算创建58000个不同的正则表达式来对抗句子,大多数搜索都不会匹配。

到目前为止,更好的方法是创建一个dict映射,将单词对中出现的每个单词映射到它可以配对的所有其他单词的set

然后依次对每个句子进行分词,将其分成单词,依次测试每个单词的成员资格,如果找到,则获得句子中其他单词与你创建的单词的集合的交集与它配对。

答案 1 :(得分:4)

您必须记住,更好的方法是使用正确的工具。正则表达式适用于(复杂)模式匹配,您无法使用word1 in sentence之类的方法,因为您正在寻找模式而不是有限字符串。

有人会说正则表达式更快,其他人会说字符串操作更快。他们都正确错误

这是一个支持字符串操作的图表:

enter image description here

这是一个关于SO的问题,支持正则表达式:Which one is faster? Regex or EndsWith?

你试图在一个句子中找到一个单词,不要过于复杂(即使你发现正则表达性感),使用in。请记住KISS原则和如果你通过攀爬树的能力判断一条鱼,那么它将会终生相信它是愚蠢的。