2010-06-15 24 views
2

我想用正則表達式替換存儲在另一個文件中的變量。我曾嘗試的代碼是:使用正則表達式與文件輸入

r = re.compile(r"self\.uid\s*=\s*('\w{12})'") 
for line in fileinput.input(['file.py'], inplace=True): 
    print line.replace(r.match(line), sys.argv[1]), 

文件中的變量的格式是:

self.uid = '027FC8EBC2D1' 

我想在一個參數來傳遞這種格式,並使用正則表達式來驗證sys.argv[1]是正確的格式,並找到存儲在此文件中的變量並將其替換爲新變量。

誰能幫助。謝謝您的幫助。

+0

究竟是什麼是你需要幫助嗎?您發佈的代碼是否按預期工作?如果是,那麼它以何種方式無效? – jchl 2010-06-15 09:13:24

+0

@jchl - 代碼沒有找到字符串,只是清除了整個文件。這是正則表達式是問題 – chrissygormley 2010-06-15 09:19:38

+0

哦,是的。正如其他人所說,re.sub是要走的路。 – jchl 2010-06-15 09:29:51

回答

4

您可以使用re.sub將匹配正則表達式,並做替代一氣呵成:

r = re.compile(r"(self\.uid\s*=\s*)'\w{12}'") 
for line in fileinput.input(['file.py'], inplace=True): 
    print r.sub(r"\1'%s'" %sys.argv[1],line), 
+0

謝謝,這項工作非常完美。 +1 – chrissygormley 2010-06-15 09:35:36

0

str.replace(old, new[, count])(舊的,新[,計數]):

返回與子的所有出現由替換字符串的副本。如果給出可選參數count,則僅替換第一個計數事件。

re.match返回或者MatchObject或(最有可能在你的情況)None,既不是str.replace需要字符串。

+0

Ghost - 我需要匹配舊字符串,因爲每次有人輸入新ID時它都會更改。 – chrissygormley 2010-06-15 09:22:57

+0

@chrissy:好'str.replace'不是正確的工具,所以。 – SilentGhost 2010-06-15 10:14:35

1

您需要使用re.sub(),不str.replace()

re.sub(pattern, repl, string[, count])

返回由替換repl替換stringpattern最左邊的非重疊發生時得到的線。如果未找到該模式,則返回stringrepl可以是字符串或函數;如果它是一個字符串,則處理其中的任何反斜槓轉義。 ...反向引用(例如\6)被模式中的group 6匹配的子字符串替換。

...

除了字符逃逸和反向引用,如上所述,\g<name>將使用由指定的組的名稱相匹配,由(?P<name>...)語法定義的子串。 \g<number>使用相應的組號;

快速測試,使用\g<number>爲反向引用:

>>> r = re.compile(r"(self\.uid\s*=\s*)'\w{12}'") 
>>> line = "self.uid = '027FC8EBC2D1'" 
>>> newv = "AAAABBBBCCCC" 
>>> r.sub(r"\g<1>'%s'" % newv, line) 
"self.uid = 'AAAABBBBCCCC'" 
>>>