在两个已知元素之间替换变量文本
s = """Comment=This is a comment
Name=Frank J. Lapidus
GenericName=Some name"""
replace_name = "Dr. Jack Shephard"
我有一个文件里面有一些文字,我一直在想怎么把一行文字替换掉,比如把“Name=Frank J. Lapidus”改成“Name=Dr. Jack Shephard”。
我该怎么用Python来做到这一点呢?补充一下:第二个元素其实是一个换行符,如果你在想的话。
谢谢。
3 个回答
0
作为一种替代常规表达式的方法(Jukka的方法),如果你需要进行很多这样的替换,并且整个文件的结构都是这样的话,可以把整个文件转换成一个字典,然后在做了一些替换后再写回去:
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())
注意事项:
首先,这个方法只适用于字段名中没有'='符号的情况(它会忽略那些没有正好一个'='符号的行)。
其次,转换成字典再转换回来会导致字段的顺序不保留,虽然你可以通过一些额外的工作来对字典进行排序。
1
使用 string.replace
方法(详细信息可以查看 这个链接):
>>> 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
你可以使用来自 re 模块的正则表达式功能。比如这样:
import re
pattern = re.compile(r"^Name=(.*)$", flags=re.MULTILINE)
re.sub(pattern, "Name=%s" % replace_name, s)
(re.MULTILINE
这个选项让 ^
和 $
分别匹配每行的开头和结尾,除了匹配整个字符串的开头和结尾。)
补充说明:根据你对 Emil的回答的评论,看来你正在处理 桌面条目 文件。这些文件的语法似乎和 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"))