我想使用正则表达式删除文件中的多行。
我有一个类似这样的文件:
host host_name {
# comment (optional)
hardware ethernet 01:22:85:EA:A8:5D;
fixed-address 192.168.107.210;
}
host another_host_name {
# comment (optional)
hardware ethernet 01:22:85:EA:A8:5D;
fixed-address 192.168.107.210;
}
基本上,当我选择主机名如host_name
时,它会检测到包含它的行并删除它之后的所有行,直到遇到第一个{
:
#before
host host_name {
# comment (optional)
hardware ethernet 01:22:85:EA:A8:5D;
fixed-address 192.168.107.210;
}
host another_host_name {
# comment (optional)
hardware ethernet 01:22:85:EA:A8:5D;
fixed-address 192.168.107.210;
}
#after
host another_host_name {
# comment (optional)
hardware ethernet 01:22:85:EA:A8:5D;
fixed-address 192.168.107.210;
}
我想我们会使用类似m = search('r"^host.*}', line)
的内容,但它适用于逐行内容,而不适用于多行。
def remove(filename, hostname):
with open(os.path.abspath("app/static/DATA/{}".format(filename)), "a") as f:
for line in f:
m = search('r"^hostname.*}', line, re.MULTILIGNE)
if m:
#we delete the bloc, I don't know how to do it though
这样开始?
答案 0 :(得分:0)
我有3个想法。
尝试MULTILINE模式。你可以在这里阅读更多相关信息:https://docs.python.org/3/library/re.html#re.MULTILINE我认为你会按照自己的意愿行事。
如果那不行,我就作弊。我将运行一个前正则表达式将所有\ n交换为像“this_is_my_special_holder”这样的奇怪的东西。现在一切都在一条线上。我会像你写的那样做我想做的工作。然后我将运行一个post regex,将所有“this_is_my_special_holder”交换回\ n。如果你遇到一种不支持多线的语言,应该总是这样做:)
您可能只能运行正则表达式,我的示例就是这样:
以下是我将如何完成这件事: 导入重新
def main(regex_part):
the_regex = re.compile("".join(["host ", regex_part, " {[^}]+}"]))
with open('test.txt', 'r') as myfile:
data=myfile.read()
data = re.sub(the_regex, "", data)
print (data)
with open('test2.txt', 'w') as newfile:
newfile.write(data)
main("host_name")
我用'with'打开文件,这样你以后就不用关闭文件句柄了。 'r'是读取文件,'w'是写文件。正则表达式简单地替换:
host host_name { everything up to the next } and then the next }
什么也没有。
http://regex101.com是一个实际玩正则表达式的便利网站。祝你好运!