0

给定一个变量名,例如myvariable,什么正则表达式可以用来用另一个变量名替换(重构)对它的引用myreplacementvariable

例如

addr = &myvariable;

应该变成

addr = &myreplacementvariable;

int myvariable2 = 0;

应该单独留下(因为它是一个不同的变量名,恰好包含 的名称myvariable

我正在寻找一两行 Python 代码,可能是正则表达式。

注意:我知道解析 C 非常困难,并且我不寻找任何考虑范围的东西。我也预见到char *mystr = "myvariable";会引起问题,但我可以解决这个问题。

提前致谢

4

3 回答 3

0

使用这个正则表达式: (\W)myvariable(\W) 并替换为\1myreplacementvariable\2

于 2013-02-11T14:42:17.067 回答
0

也许这有帮助:

value = "addr = &myvariable;"
findVar = "myvariable"
m = re.findall("[&]{0};".format(findVar), value)
print m
# prints: ['&myvariable;']

请注意,我通过将 & 符号放在 [] 中来避开它。你也可以用两个反斜杠转义它:

m = re.findall("\\&{0};".format(findVar), value)

编辑:

这是基于评论中讨论的 re.sub 版本:

value = "addr = &myvariable;\naddr = &myvariable;\nfuncCall( &myvariable )"
oldVarName = "myvariable"
newVarName = "mynewvariable"
m = re.sub("(\\&){0}(;?)".format(oldVarName), r"\1"+newVarName+r"\2", value)
print m
# this will print:
# addr = &mynewvariable;
# addr = &mynewvariable;
# funcCall( &mynewvariable )

此模式将具有与以下相同的结果:

value.replace("&"+oldVarName,"&"+newVarName)

我使用括号来匹配开头的 & 和结尾的可能分号。然后我使用 \1 和 \2 将这些匹配项放回替换字符串中。请注意,此结果类似于使用: value.replace("&"+oldVarName, "&"+newVarName)

编辑: 这可能更接近你所需要的。

它替换了以 & 符号开头的每个实例,并且包含整个旧变量名称,并且不包含后面 [A-Za-z0-9_] 中的任何字符。

value = "addr = &myvariable;\naddr = &myvariable;\nfuncCall( &myvariable )\nfuncCall2( &myvariable, &myvariablelongername )"
oldVarName = "myvariable"
newVarName = "mynewvariable"
m = re.sub("(\\&){0}(?![A-Za-z0-9_])".format(oldVarName), r"\1"+newVarName, value)
print m
# prints:
# addr = &mynewvariable;
# addr = &mynewvariable;
# funcCall( &mynewvariable )
# funcCall2( &mynewvariable, &myvariablelongername )

(最后一部分是 C 中变量名中的任何有效字符,在需要以 [A-Za-z_] 开头的第一个字符之后。'nhahtdh' 的答案中也提到了这一点)

使用 nhahtdh 提供的内容作为示例,这将是上一个示例的较短版本:

re.sub("(\\&){0}(?!\b)".format(oldVarName), r"\1"+newVarName, value)

由于在编写此答案时对我来说是新的,并且我自己在此答案中的评论中混淆了我将其添加为信息:r在像 r"\1" 这样的字符串前面将字符串变成原始细绳。

r '保留\的原始字符串(文字化):对于正则表达式和Windows路径很方便!' 来源:http ://rgruet.free.fr/PQR26/PQR2.6.html#Strings

于 2013-02-11T14:53:36.463 回答
0

使用这个正则表达式:

\bvarname\b

varname可以是任何有效的变量名(由这个 regex 描述[A-Za-z_][A-Za-z0-9_]*)。

C 中的变量由a-z, A-Z,0-9和组成_,这正是单词 character 的定义\w,单词边界\b的定义基于此。我们必须确保变量名不是其他变量名的一部分,也不是文字数字的后缀(例如3.0f,,0x87654321UL)。这就是我们\b在变量名的两端使用的原因。

于 2013-02-11T15:05:16.550 回答