Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换表达式中的变量_Python_Regex - Fatal编程技术网

Python 替换表达式中的变量

Python 替换表达式中的变量,python,regex,Python,Regex,我使用regexp查找并替换python表达式中字符串格式的变量。我不希望“var”被替换为另一个函数或变量名的一部分。(我禁止在expr和expr.replace(“var”等)中使用if'var'的解决方案) 因此,我使用以下regexp检查前面的字符(允许)和下面的字符(允许): pattern = re.compile(r'(^var)(?=\+|\-|\*|\/| |$)|(?<=\+|\=|\[|\-|\*|\/|,| |\()var(?=\+|\-|\*|\/|$| |,|\

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

因此,我使用以下regexp检查前面的字符(允许)和下面的字符(允许):

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

  • 如果“var”在表达式中,则检查
  • 替换表达式中的“var”的步骤
  • 检查“var”在被替换后是否不在表达式中
if模式搜索(expr):
new_expr=re.sub(模式“####”,expr)
assert not pattern.search(new_expr),“Replace failed”

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

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

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

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

regex不是解析编程语言的首选工具。查看ast模块。你没有替换
var[x]
中的
var
,这似乎很奇怪-这是故意的,还是打字错误?这不是错误,我不希望var是一个dict。它看起来像是一个例外的边界。我不确定你在说什么,但有效的代码不会处理命名空间中具有相同名称的两个变量
var
is
var
is
var
。我是否编写了一个复杂的regexp来匹配转储表达式?我会检查密码,我会给你答案。你说得对,这不是真实情况。测试regexp的更好方法是使用表达式列表和预期表达式列表。解决方案与“\b”一起工作。我编写此示例是为了不匹配以下情况:avar[x]=>a###[x],即使是var[x],但var[x]在我的代码中也永远不存在。”\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,###)+ ###  -###/###+###*###*(###)'