给定一个变量名称,例如myvariable
,可以使用什么正则表达式替换(重构)对它的引用,使用另一个变量名myreplacementvariable
e.g。
addr = &myvariable;
应该变成
addr = &myreplacementvariable;
BUT
int myvariable2 = 0;
应该保持不变(因为它是一个恰好包含myvariable
名称的不同变量名称)
我正在寻找一两行Python,可能还有Regex。
注意:我知道解析C非常困难,并且不会寻找任何考虑范围的东西。我也预见char *mystr = "myvariable";
会导致问题,但我可以解决这个问题。
提前致谢
答案 0 :(得分:0)
使用此正则表达式:(\W)myvariable(\W)
并替换为\1myreplacementvariable\2
答案 1 :(得分: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)
修改强> 这可能更接近您的需求。
它替换以&符开头的每个实例AND包含整个旧变量名,并且不包含之后在[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'一个原始字符串,其中\被保存(字面化):对于正则表达式和窗口路径很方便! 资料来源:http://rgruet.free.fr/PQR26/PQR2.6.html#Strings
答案 2 :(得分:0)
使用此正则表达式:
\bvarname\b
varname
可以是任何有效的变量名称(由此正则表达式[A-Za-z_][A-Za-z0-9_]*
描述)。
C中的变量由a-z
,A-Z
,0-9
和_
组成,这正是定义为单词\w
的单词,其中包含单词\b
边界3.0f
的定义基于。我们必须确保变量名称不是其他变量名称的一部分,并且也不是文字数字的后缀(例如0x87654321UL
,\b
)。这就是我们在变量名的两端使用{{1}}的原因。