我有一个 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]*(?=(?:,|$))"
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/