python - 使用 python 在循环内正则表达式搜索非常慢

标签 python regex

我发现了一件奇怪的事情

for el in values:
    unit=re.search(regex_unit, el, re.IGNORECASE).group()
    value=re.search(regex_value, el, re.IGNORECASE).group()
    print("Unit: "+unit+" - "+"Value: "+value)

这段代码非常慢,但如果我用这种方式编写它,它会非常快......

for el in values:
    unit=re.search(regex_unit, el, re.IGNORECASE).group()
    print("Unit: "+unit)
for el in values:
    value=re.search(regex_value, el, re.IGNORECASE).group()
    print("Value: "+value)

第一段od代码有什么问题?

*** 更新

regex_unit="(kb|mb|gb)"
regex_value="\d"

最佳答案

对于正则表达式,一般来说,我建议编译它们。

这个答案当然没有回答速度差异是怎么来的问题。但我的一个猜测是,Python 运行时就是这样做的:

如果它必须执行正则表达式,它会编译它并缓存结果。如果它在没有其他正则表达式的循环内运行(如第二个代码中),则使用缓存版本。但如果它与其他正则表达式交替,缓存的版本总是会被覆盖,并且必须总是重新创建,这会大大降低速度,因为编译步骤必须一次又一次地完成。

您可以通过自己编译来绕过该问题,如下所示:

regex_unit_compiled = re.compile(regex_unit)

之后,在循环中使用它,如下所示:

unit=regex_unit_compiled.search(el, re.IGNORECASE).group()

无论我的猜测是否正确,使用编译的正则表达式你应该会更好。

关于python - 使用 python 在循环内正则表达式搜索非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006634/

相关文章:

regex - PowerShell Regex获取2个字符串之间的子字符串

python - 将带有前导零整数的字符串转换为 json

python - 使用 smtpd.DebuggingServer 作为 STMP 服务器从 python 发送电子邮件

javascript - 将 Stringarray 交给 django 模板并在 d3 中使用它

python - 为什么 binascii.b2a_base64() 和 base64.b64encode() 之间存在差异?

python - 匹配多个条件的掩码数据框

javascript - 需要爱尔兰电话号码的正则表达式

python - 子进程在线程死亡时死亡

java - 使用正则表达式进行流模式匹配

regex - 正则表达式库基准测试