2010-06-11 134 views
2

我想用正則表達式來搜索一個UUID數字的文檔,並用新的數字替換它的結尾。我到目前爲止的代碼是:搜索一個字符串,並將其替換爲一個變量

read_file = open('test.txt', 'r+') 
write_file = open('test.txt', 'w') 

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 
for l in read_file: 
    m1 = r.match(l) 
    if m1: 
     new=(str,m1.group(2)) 
     new?????? 

這裏我卡住了。

文件test.txt具有存儲在它下面的UUID:

self.uid = '5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22' 

我想更換部分D15C7F9E1F22

我也試過這樣:

r = re.compile(r'(self.uid\s*=\s*)(\S+)') 
for l in fp: 
    m1 = r.match(l) 
    new=map(int,m1.group(2).split("-") 
    new[4]='RHUI5345JO' 

但我似乎無法匹配的字符串。

在此先感謝您的幫助。

+0

我已經修復並測試了它:現在就試試。 – 2010-06-11 16:29:44

+0

你在說我的一般情況下的正則表達式嗎?我也修復了它。對不起,錯誤。 – 2010-06-14 13:24:46

回答

3

前瞻性替代?

你不能只是使用

for l in read_file: 
    l.replace("5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22", 
       "5EFF837F-EFC2-4c32-A3D4-RHUI5345JO") 
    # Write to file.. 

還是有更多的故事比你告訴我們嗎?另外,除非它是一個太大的文件,否則我會建議將整個文件讀入一個字符串中,並且爲了提高速度而只做一個替換。

1

我覺得你的正則表達式關:

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 

應該是:

r = re.compile(r"(self\.uid\s*=\s*'5EFF837F-EFC2-4c32-A3D4-)([^']*)'") 

然後,當你有一個比賽,搶1組,並將其分配給一個變量和追加的更換字符串。

([^']*)組將搜索高達'標記的任何字符。這是你的目標移除組。

編輯:2010年6月11日@ 2:27 EST:賈斯汀皮爾有一個好點。你可以直接搜索並用這些數據替換。除非你正在尋找的8個字符的模式,其次是4,4,4,和12 ...在這種情況下,你可以使用該模式:你爲什麼要使用正則表達式這樣的直

r = re.compile(r"self\.uid\s*=\s*('\w{8}-(:?\w{4}-){3})(\w{12})'") 
+0

我得到該解決方案的語法錯誤? – chrissygormley 2010-06-11 16:17:13

+0

感謝您的幫助,但我有一個額外的支架。我試圖刪除它,但我無法讀取字符串。我可能已經在錯誤的地方去掉了支架。 – chrissygormley 2010-06-14 09:24:41

相關問題