在两个已知元素之间替换变量文本

0 投票
3 回答
1710 浏览
提问于 2025-04-16 08:14
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"))

撰写回答