我正在使用regexp以字符串格式查找和替换python表达式中的变量。我不希望'var'被替换成另一个函数或变量名的一部分。 (我在expr和expr.replace(“var”等)中使用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,###)+ ### -###/###+###*###*(###)'
我使用regexp:
if pattern.search(expr):
new_expr = re.sub(pattern, '###', expr)
assert not pattern.search(new_expr), 'Replace failed'
我使用代码很多时间,我想知道是否存在更简单/更快的内容?
答案 0 :(得分:1)
嗯,你需要的模式是:r'\bvar\b'
,\b
是“border”,它允许我们定义我们想要替换的完整“字符串”而不替换“变量”
然而,在测试你的“预期”字符串时,我发现它有一个错误:
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,###)+ ### -###/###+###*###*(###)'