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

Python 在两个已知元素之间替换变量文本,python,text,replace,Python,Text,Replace,我在一个文件中有一些文本,一直在试图找出如何搜索和替换一行,这样Name=Frank J.Lapidus就变成Name=Jack Shephard博士 我如何在Python中实现这一点?编辑:(顺便说一句,第二个元素应该是a\n,以防万一) 谢谢。使用字符串。替换(记录在下): 您可以使用模块中的正则表达式函数。例如: >>> s = """Comment=This is a comment ... Name=Frank J. Lapidus ... GenericName=S

我在一个文件中有一些文本,一直在试图找出如何搜索和替换一行,这样Name=Frank J.Lapidus就变成Name=Jack Shephard博士

我如何在Python中实现这一点?编辑:(顺便说一句,第二个元素应该是a\n,以防万一)


谢谢。

使用
字符串。替换
(记录在下):


您可以使用模块中的正则表达式函数。例如:

>>> 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'
(除了字符串的开头和结尾外,
re.MULTILINE
选项使
^
$
分别匹配行的开头和结尾。)


编辑后添加:根据您对的评论,您似乎在操作文件。它们的语法似乎非常接近模块所使用的语法(可能在节名称的大小写敏感度方面存在一些差异,并且在整个解析/序列化周期中应该保留注释)

例如:

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

作为正则表达式解决方案(Jukka’s)的替代方案,如果您希望进行许多替换,并且整个文件是以这种方式构造的,请将整个文件转换为字典,然后在进行一些替换后重新写出:

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"))
注意事项:
首先,这仅在字段名中没有“=”符号时有效(它忽略没有一个=符号的行)

第二,转换为dict和back不会保留字段的顺序,尽管您至少可以通过一些额外的工作对字典进行排序

这与“已知元素”有什么关系?你似乎知道你到底想替换什么!您的意思是要替换“Name=”和行尾之间的文本吗?整个文件是否为“Something=”格式?你做的替换比这一个多吗?你遇到过
ConfigParser
?这对你有用吗?嗨,伦纳德。很抱歉给你带来了混乱。是的,就像你说的。Something=的值是可变的,所以正如您所说,Something=和\n之间的任何值都不会发生在每个值上,但会发生在其中一些值上。我将用
Name=Frank J.Lapidus
替换
Name=
感谢您的建议,但是Name=的值是完全可变的。我一直在做。。。s=“”Comment=这是一个信息图标Name=单击以接收天气信息GenericName=信息图标”““find_Name=re.search('Name=”,s)f=open('test.desktop','r'),用于f.readlines()中的行:如果find_Name:line=line.replace(line,('Name=“+“Hello”+“\n”))打印行f.close(),但这并不是我所期望的结果。不过我会继续搞砸的,基托斯·朱卡。这两个例子都很有效。我注意到ConfigParser似乎删除了所有注释,包括#/usr/bin/env-xdg开放行(Yikes!),但我现在只是在研究模块的文档,看看是否能找到解决方法。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"))
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())