2013-02-11 99 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