2010-12-08 50 views
0
s = """Comment=This is a comment 
Name=Frank J. Lapidus 
GenericName=Some name""" 
replace_name = "Dr. Jack Shephard" 

我在文件中有一些文本,並且一直在試圖弄清楚如何搜索和替換一行以便名稱= Frank J. Lapidus變成Name = Dr。 Jack Shephard替換兩個已知元素之間的變量文本

我怎麼能在Python中做到這一點?編輯:(順便說一句,第二個元素將是\ n以防萬一你想知道)。

謝謝。

+0

這與「已知元素」有什麼關係?你似乎知道你到底想要取代什麼! – SilentGhost 2010-12-08 14:10:18

+0

你的意思是你想要替換「Name =」和行尾之間的文本嗎?整個文件是「Something =」格式的嗎?你在做更多的替代品嗎? – 2010-12-08 14:56:10

+1

你有沒有遇到`ConfigParser`?它對你有用嗎? http://docs.python.org/library/configparser.html – katrielalex 2010-12-08 15:09:15

回答

0

你可以使用正則表達式函數從re模塊。例如是這樣的:

import re 
pattern = re.compile(r"^Name=(.*)$", flags=re.MULTILINE) 
re.sub(pattern, "Name=%s" % replace_name, s) 

(該re.MULTILINE選項使^$匹配的開始和線路,分別的端部中,除了開始和字符串的結尾。)


編輯補充:根據您的意見Emil's answer,似乎你操縱Desktop Entry文件。它們的語法似乎非常接近ConfigParser模塊所使用的語法(可能在區段名稱的區分大小寫的區別方面存在一些差異,並且期望在解析/序列化循環中保留註釋)。

一個例子:

import ConfigParser 
parser = ConfigParser.RawConfigParser() 
parser.optionxform = str # make option names case sensitive 
parser.read("/etc/skel/examples.desktop") 
parser.set("Desktop Entry", "Name", replace_name) 
parser.write(open("modified.desktop", "w")) 
1

使用string.replacehttp://docs.python.org/library/stdtypes.html#string-methods下記錄):

>>> s = """Comment=This is a comment 
... Name=Frank J. Lapidus 
... GenericName=Some name""" 
>>> replace_name = "Dr. Jack Shephard" 
>>> s.replace("Frank J. Lapidus", replace_name) 
'Comment=This is a comment\nName=Dr. Jack Shephard\nGenericName=Some name' 
0

作爲替代正則表達式的解決方案(尤卡的),如果你正在尋找做多這些替換和整個文件的這樣的結構,轉換整個文件轉換成一個字典,然後它的一些替代品後寫回再次:

d = dict(x.split("=") for x in s.splitlines() if x.count("=") is 1) 
d["Name"] = replace_name 
new_string = "\n".join(x+"="+y for x,y in d.iteritems()) 

注意事項:
首先,這隻能如果沒有「=」在你的領域名稱標誌(它忽略了線,唐」沒有確切的一個=符號)。
其次,轉換爲字典和後面不會保留字段的順序,儘管您至少可以對字典進行一些額外的工作。

相關問題