使用Python在C文件中查找变量引用的正则表达式

时间:2013-02-11 14:29:21

标签: python regex

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

e.g。

addr = &myvariable;

应该变成

addr = &myreplacementvariable;

BUT

int myvariable2 = 0;

应该保持不变(因为它是一个恰好包含myvariable名称的不同变量名称)

我正在寻找一两行Python,可能还有Regex。

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

提前致谢

3 个答案:

答案 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-zA-Z0-9_组成,这正是定义为单词\w的单词,其中包含单词\b边界3.0f的定义基于。我们必须确保变量名称不是其他变量名称的一部分,并且也不是文字数字的后缀(例如0x87654321UL\b)。这就是我们在变量名的两端使用{{1}}的原因。