Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的正则表达式是否太慢?_Python_Regex - Fatal编程技术网

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

Python中的正则表达式是否太慢?,python,regex,Python,Regex,我在一个文件中有一组句子(比如500)。我试图找出这些句子中是否有一对单词(比如word1和word2)。我有58000对这样的词 例如,让这组句子为: 我是个好孩子。他是个坏孩子。我是一个非常好的男孩。 要搜索的词对: am,good 所以这应该返回第一句和最后一句作为输出 我正在使用以下正则表达式: for match in re.finditer(r'([ A-Za-z0-9]*)\b{string1}\b([^\.!?]*)\b{string2}\b([^\.!?]*[\.!?])'.f

我在一个文件中有一组句子(比如
500
)。我试图找出这些句子中是否有一对单词(比如
word1
word2
)。我有58000对这样的词

例如,让这组句子为:

我是个好孩子。他是个坏孩子。我是一个非常好的男孩。

要搜索的词对:

am
good

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

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

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分钟

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


所以,我觉得正则表达式有时非常慢。这是真的吗?有什么方法可以提高速度吗?

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

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


然后,对于每个句子,依次将其拆分为单词,依次测试每个单词是否是词典的成员,如果找到了,则获得句子中其他单词与您创建的单词集的交叉点。

您必须记住,做事情的更好方法是使用正确的工具。正则表达式适用于(复杂)模式匹配,因为您要查找的是模式而不是有限字符串,所以不能在句子中使用像
word1这样的方法

一些人会说正则表达式更快,其他人会说字符串操作更快。他们都是对的,也都是错的

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

这里有一个有利于regex的问题:



你想在一个句子中找到一个词,不要过于复杂(即使你觉得正则表达式很性感),在
中使用
。记住这一原则,如果你根据一条鱼爬树的能力来判断它,它会终生相信它是愚蠢的。

你的模式的复杂性已经说明了很多问题。另外,模式是动态编译的,而不是预先编译的。这不是Python特有的问题;你的正则表达式中有一个;限制那些贪婪的量词@MosesKoledoye我的逻辑是在所有句子之间寻找一对单词。还有其他更简单的模式吗?“模式是动态编译的,而不是预编译的”-不完全正确,Python根据缓存最近使用的模式,例如@jonrsharpe上的注释使用
插入。format
不更新模式?我假设OP正在改变那些带有外环的。