我有一个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_string
是t,w,g,g,hun,t,w
),然后在逗号之间查看,而不是仅仅查看逗号(即一种非贪婪的方式)。有谁知道这实际上是如何评估的?
如果字符串超长,那么正则表达式是否知道以非贪婪的方式在逗号之间进行评估?谢谢。
答案 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
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(',')])