2016-11-18 74 views
0

我正在寫一個文本文件,但它不能正常工作,因爲我預期。Python - 寫入文件文本的有效方法?

這是我有:

#!/usr/lib/env python 
import re 

file = open("address.txt","r") 
content = file.read() 
file.close() 
content = content.split('LAN ')[1:] 
dic = {} 
for lan in content: 
    dic[int(lan[0])] = lan[1:] 



def address(lan_index): 
    address = re.findall('address\s(.*?)\s',dic[lan_index]) 
    if len(address) > 0: 
     print 'LAN', lan_index, ":", address[0] 
    else: 
     print 'No Address Found!' 
    return address[0] 


ad1 = str(address(1)) 
new_ad = ad1 
var1 = 'ad1' 


filedata = None 
with open('address.txt', 'r') as file : 
    filedata = file.read() 

filedata = filedata.replace(ad1 , var1) 

with open('address.txt', 'w') as file: 
    file.write(filedata) 

這裏是我的文本文件:

#line addresses LAN 1 
     address 192.168.6.6 
     network 192.168.6.6 

我的問題是,當我想要替換ad1var1它不會取代只是我address僅將取代network以及他們擁有相同的IP。

我的輸出是這樣的:

地址AD1

網絡AD1

是否有一個有效的和可能的方式,以避免這一點,並得到這樣的:

地址ad1

網絡192.168.6.6

如果可能,我將不勝感激。 謝謝

+1

按行讀取文件?只有在包含地址而不是網絡的情況下才更換該行? –

+0

@ cricket_007不是一個壞主意..如果只需要簡單的匹配,regex實際上通常比簡單的字符串操作要慢。正則表達式的好處是靈活性和複雜的模式,而不是速度。 – Aaron

回答

2

由於filedata.replace(ad1 , var1)是貪婪的,您的地址都被替換。你可以通過給它一個可選的第三個參數來限制它:filedata.replace(ad1 , var1, 1)告訴它做最多1替換,或者你可以擴大你的捕獲組:'(address\s.*?)\s'包括「地址」,並使var1 = "address ad1",以便filedata.replace只發現具有「地址「