即使我把它展望未来并且看后面的要求,正则表达式总是贪婪吗?

时间:2015-12-11 20:48:18

标签: 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

我在很多文件上试试这个。有时文件很大,有时文件很小。偶尔,我会从MemoryError库中获得re.py。拆分此执行的最佳方法是什么,以便我不会得到MemoryError

我担心正则表达式首先查看ENTIRE字符串(例如if text_stringt,w,g,g,hun,t,w),然后在逗号之间查看,而不是仅仅查看逗号(即一种非贪婪的方式)。有谁知道这实际上是如何评估的?

如果字符串超长,那么正则表达式是否知道以非贪婪的方式在逗号之间进行评估?谢谢。

2 个答案:

答案 0 :(得分:1)

你的模式真的很奇怪。

  • (?:(?<=\,)|(?<=^)) - 这可以变成一个常规的非捕获组(?:,|^)
  • [^\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,

答案 1 :(得分:0)

如果没有正则表达式,你可以更快地完成这项工作:

s = 't,w,g,g,hun,t,w'
res = ','.join(['' if x.lower()=='hun' else x for x in s.split(',')])