gpt4 book ai didi

python - 即使我给它向前看和向后看的要求,正则表达式是否总是贪婪的?

转载 作者:太空宇宙 更新时间:2023-11-03 17:09:37 25 4
gpt4 key购买 nike

我有一个 re.sub 程序,它可以替换 text_string 中逗号之间的某些值:

re.sub('(?:(?<=\,)|(?<=^))[^\w\d\r\n\t]*(HUN)[^\w\d\r\n\t]*(?=(?:\,|$))','',text_string,flags=re.IGNORECASE)

它将 HUN 替换为空。

我在很多文件上尝试过这个。有时文件很大,有时很小。有时,我会从 re.py 库中收到 MemoryError。分割此执行的最佳方法是什么,这样我就不会收到 MemoryError

恐怕正则表达式首先查看整个字符串(例如,如果 text_string is t,w,g,g,hun,t,w ),然后在逗号之间查找,而不是仅在逗号之间查找(即以非贪婪的方式)。有谁知道这实际上是如何评估的?

如果字符串超长,正则表达式是否知道以非贪婪的方式计算逗号之间的值?谢谢。

最佳答案

你的模式真的很奇怪。

  • (?:(?<=\,)|(?<=^)) - 这可以变成一个常规的非捕获组 (?:,|^)
  • [^\w\d] - 自 \w已经匹配\d , \d是多余的
  • [^\w\r\n\t]* - 匹配标点符号(!),因此 , , 也。这使得正则表达式引擎很难分析 hun 之前有许多逗号分隔值的字符串。 。
  • (?=(?:,|$)) - 如果您打算匹配重叠的字符串,则前瞻有意义,否则,您可以将其替换为 (?:,|$) .

我建议:

r"(?i)(?:,|^)[^\w\r\n\t]*(HUN)[^\w\r\n\t]*(?=(?:,|$))"

参见regex demo

Python demo :

import re
s = ",WWWWWW,hun,hun,WWWWW,"
print re.sub(r"(?i)((?:,|^)[^\w\r\n\t]*)HUN([^\w\r\n\t]*)(?=(?:,|$))", r"\1\2", s)
# => ,WWWWWW,,,WWWWW,

关于python - 即使我给它向前看和向后看的要求,正则表达式是否总是贪婪的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34232314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com