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

时间:2010-12-08 14:08:07

标签: python text replace

s = """Comment=This is a comment
Name=Frank J. Lapidus
GenericName=Some name"""
replace_name = "Dr. Jack Shephard"

我在文件中有一些文字并且一直在试图弄清楚如何搜索和替换一行,因此Name = Frank J. Lapidus成为Name = Dr。杰克谢泼德

我怎么能用Python做到这一点?编辑:(顺便说一句,第二个元素将是\ n,以防万一你想知道)。

感谢。

3 个答案:

答案 0 :(得分:1)

使用string.replace(记录在http://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'

答案 1 :(得分: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"))

答案 2 :(得分: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())

警告:
首先,只有在您的字段名称中没有“=”符号时才会起作用(它忽略了没有一个=符号的行)。
其次,转换为dict和back将不会保留字段的顺序,尽管您至少可以通过一些额外的工作对字典进行排序。