0

我正在使用正则表达式以字符串格式查找和替换 python 表达式中的变量。我不希望替换的“var”成为另一个函数或变量名的一部分。(我禁止在 expr 和 expr.replace("var", etc.) 中使用 if 'var' 的解决方案)。

因此,我使用以下正则表达式检查前面的字符(允许)和后面的字符(允许):

pattern = re.compile(r'(^var)(?=\+|\-|\*|\/| |$)|(?<=\+|\=|\[|\-|\*|\/|,| |\()var(?=\+|\-|\*|\/|$| |,|\))')

ô_O,它似乎很复杂,但它适用于以下测试,将 'var' 替换为 '###'

expr     = ' var + variable + avar + var[x] + fun(var,variable) + fun2(variable, var, var1) + fun3(variable,var)+ var  -var/var+var*var*(var)'
expected = ' ### + variable + avar + var[x] + fun(###,variable) + fun2(variable, ###, var1) + fun3(variable,###)+ ###  -###/###+###*###*(###)'

我使用正则表达式:

  • 检查 'var' 是否在表达式中
  • 替换表达式中的 'var'
  • 检查被替换后'var'是否不在表达式中。
if pattern.search(expr):
  new_expr = re.sub(pattern, '###', expr)  
  assert not pattern.search(new_expr), 'Replace failed'

我经常使用代码,我想知道是否存在更简单/更快的东西?

4

1 回答 1

1

好吧,您需要的模式是:r'\bvar\b'\b是“边框”,它让我们定义我们想要替换的完整“字符串”,而无需替换“变量”之类的东西

但是,在测试您的“预期”字符串时,我发现它有一个错误:

expected = ' ### + variable + avar + var[x] ' # <- this last 'var' should be ###

反正。解决方案:

>>> import re
>>> re.sub(r'\bvar\b', '###', expr)
' ### + variable + avar + ###[x] + fun(###,variable) + fun2(variable, ###, var1) + fun3(variable,###)+ ###  -###/###+###*###*(###)'
于 2013-10-21T13:27:45.233 回答