正则表达式总是贪婪的,即使我给它前瞻和落后的要求吗?

2024-04-25 00:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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?你知道吗

我担心正则表达式是先查看整个字符串(例如,iftext_stringist,w,g,g,hun,t,w),然后再查看逗号之间的字符串,而不是只查看逗号之间的字符串(即,以非贪婪的方式)。有人知道这是怎么评估的吗?你知道吗

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


Tags: 文件方法字符串textpy程序restring
2条回答

你的模式真奇怪。你知道吗

  • (?:(?<=\,)|(?<=^))-这可以变成一个常规的非捕获组(?:,|^)
  • [^\w\d]-因为\w已经匹配了\d,所以\d是冗余的
  • [^\w\r\n\t]*-匹配标点(!)因此,。这使得regex引擎很难分析在您的hun之前有许多逗号分隔值的字符串。你知道吗
  • (?=(?:,|$))-如果您计划匹配重叠的字符串,那么lookahead是有意义的,否则,您可以用(?:,|$)替换它。你知道吗

我建议:

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,

您可以在不使用regex的情况下以更快的方式执行此操作,如下所示:

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

相关问题 更多 >