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

标签 python regex substring regex-greedy non-greedy

我有一个 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/

相关文章:

java - java回文错误

regex - 仅验证 A-Z、a-z、0-9、空格、句点、连字符 - 感叹号的正则表达式!问号?引号 ”

c++ - 本身的子串

python - Pandas 相当于 Python 的 readlines 函数

python - 如何使用 .createDataFrame() 读取标题?

python - 在 python 中将时间字符串 XhYmZs 转换为秒

python - Pandas :如何使用 _iLocIndexer?

regex - 区域设置感知 Perl 正则表达式(匹配单词边界)

c# - 获取静态长度子串

iphone - Objective-c 子字符串范围异常