如何在python中使用正则表达式删除文本文件中的多行?

时间:2017-11-28 14:27:35

标签: python regex

我想使用正则表达式删除文件中的多行。

我有一个类似这样的文件:

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

这样开始?

1 个答案:

答案 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是一个实际玩正则表达式的便利网站。祝你好运!