2013-02-11 98 views
0

假定给出变量的名称,如myvariable C文件查找变量引用,什么正则表达式可用于与另一变量名myreplacementvariable正则表达式中使用Python

例如替换它(重构)的引用

addr = &myvariable; 

应该变成

addr = &myreplacementvariable; 

int myvariable2 = 0; 

应单独存在(因为它是恰好包含的myvariable名称的不同变量名)

我我正在寻找一条或两条Python,可能与正则表达式。

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

在此先感谢

+0

那么你认为什么水平的解决方案可以接受?你知道正则表达式的解决方案很容易破解,但是你是否有一些假设? – nhahtdh 2013-02-11 14:33:22

+0

你知道这将是int吗?你为什么不在变量前面检查'='并替换它?像'=。* myvariable'。 – ATOzTOA 2013-02-11 14:39:09

+0

我想忽略范围和'字符* myStr的=“MYVARIABLE”的解决方案;'的问题,但没有别的 – James 2013-02-11 14:49:13

回答

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开头的所有实例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提供作为实例提到这将是最后一个例子的一个较短的版本:

​​

既然写这个的时候是新的我回答并得到了由自己在这个答案混杂在评论中,我将以此为信息:[R在如R字符串前面的“\ 1”转串入一个原始字符串。

r'一个原始字符串,其中\被保留(文字化):方便正则表达式和窗口路径!' 来源:http://rgruet.free.fr/PQR26/PQR2.6.html#Strings

+0

这看起来非常好,可以're.sub'使用做出替代? – James 2013-02-11 14:56:28

+0

另外,我想不依靠';'是在变量引用结束(因为我想它来代替函数调用中的变量引用) – James 2013-02-11 14:57:39

+0

你可以尝试像“[&]{0}[;] *” .format(findVar)作为模式。如果我可以编写一个示例在输入中替换它,我会尽快尝试。 oldVar与&newVar:;) – 2013-02-11 14:59:16

0

使用这个表达式:(\W)myvariable(\W)和替换\1myreplacementvariable\2

0

使用此正则表达式:

\bvarname\b 

varname可以是任何有效的变量名(由此正则表达式[A-Za-z_][A-Za-z0-9_]*描述)。

变量C由a-zA-Z0-9_,这正是定义为字字符\w,在其上字边界\b的定义是基于。我们必须确保变量名是不是其他变量名的一部分,也没有后缀的面值数字(例如3.0f0x87654321UL)。这就是为什么我们在变量名的两端使用\b