根据搜索条件python删除多行

时间:2015-03-17 23:47:43

标签: python

我正在使用DHCP编辑器来添加,删除和搜索主机。我有代码,将搜索和添加主机我想我会以某种方式将两者结合起来删除主机,但这不起作用。我想要做的是创建一个f.readlines()的元素索引列表,然后使用myindex的值,然后从我正在编辑的DHCP文件中运行lines.remove(myindex)

示例我想搜索foonode或任何节点,并删除以下格式:

    host barnode{
    option host-name "barnode";
    option root-path "0.0.0.0:/barnode";
    option subnet-mask ;
    option routers ;
    hardware ethernet  ;
    fixed-address ;
}





host foonode{
    option host-name "foonode";
    option root-path "0.0.0.0:/foonode";
    option subnet-mask ;
    option routers ;
    hardware ethernet  ;
    fixed-address ;
}




host foobarnode{
    option host-name "foobarnode";
    option root-path "0.0.0.0:/foobarnode";
    option subnet-mask ;
    option routers ;
    hardware ethernet ;
    fixed-address ;
}

我可以使用以下代码搜索文件:

def delete_host():

    host=raw_input('Please enter host you would like to delete: ');
    start = False;
    f=open(infile, 'r')
    myfile=str()
    myindex=list()
    mystr=str()
    count = 0
    lines = f.readlines()
    for line in lines:
            if re.search(host, line):
                    start = True

            if start:
                   print line
                   myindex = [lines.index(line)]   


                    if re.search('}', line):
                            break

并获得此输出:

    host foonode{

    option host-name "foonode";

    option root-path "0.0.0.0:/foonode";

    option subnet-mask ;

    option routers ;

    hardware ethernet ;

    fixed-address ;

我想在搜索条件中为f.readlines()的元素索引值创建和索引列表。然后使用这些值来执行lines.remove(myindex.index())以删除运行上述代码时得到的输出。基本上我如何搜索任何节点并从文件中删除它们。 也许创建一个索引不是解决这个问题的最好方法我只是用完了搜索谷歌的表达式。

我知道我必须做newfile= open('/var/tmp/foodhcp' 'w')但我想在开始编写文件之前弄清楚逻辑。

4 个答案:

答案 0 :(得分:0)

请注意,从正在循环的列表中删除项目将无法按预期方式工作。我建议

a = [1,2,3,4,5]
del a[2:4]

a == [1,2,5]

您已经能够找到开始和结束行,所以只需在找到后运行del。

答案 1 :(得分:0)

如果您已经拥有行列表,只需从要删除的行之前和之后的部分创建新的更新列表:

import re

with open('data.txt') as f:
    s = f.read()

print("Before:")
print(s)

def delete_host(s):
    host = raw_input('Please enter host you would like to delete: ')

    lines = s.split('\n')
    for i, line in enumerate(lines):
        if re.match(r'\s*host\s+' + host + '\s*{', line):
            break

    for j, line in enumerate(lines[i+1:]):
        if re.match(r'\s*}', line):
            break

    j = i + j + 1

    new_lines = lines[:i] + lines[j+1:]
    return '\n'.join(new_lines)

s = delete_host(s)
print("After:")
print(s)

(请注意,没有错误检查缺少的主机名,格式不正确,或者有可能影响正则表达式的有趣符号的主机名)。

如果您确定所有条目总是看起来像您描述的那样(特别是}正文中的任何地方都不会遇到host),您可以将其简化为

def delete_host(s):
    host = raw_input('Please enter host you would like to delete: ')
    return re.sub(r'\s*host\s+' + host + '\s*{[^}]*}', '', s, flags=re.MULTILINE)

最安全的方法是实际解析配置文件,获取数据结构,删除条目,然后创建新的配置文件。

答案 2 :(得分:0)

说实话,我不明白上面的例子。我一直在努力,并提出以下内容,我创建了一个填充了我的搜索代码输出的列表。然后我想写每一行不等于myindex。我很困惑

import re
infile='C:\dhcp.txt'
def delete_host():
    infile = 'C:\dhcp.txt'
    host=raw_input('Please enter host you would like to delete: ');
    start = False;
    f=open(infile, 'r')
    nf=open(r'C:\test.txt', 'w')
    myindex=list()
    mystr=str()
    count = 0
    lines = f.readlines()

    for i, line in enumerate(lines):
            if re.search(host, line):
                start = True
                if start:
                 myindex.append(line)
                if re.search('}',line):
                    break
    for myindex in lines:
        if lines != myindex:
            mystr.join(lines)
            nf.write(mystr)
            nf.close
delete_host();

我还尝试创建一个元素列表,然后尝试使用del删除这些元素,但我一直遇到错误

def delete_host():
    infile = 'C:\dhcp.txt'
    host=raw_input('Please enter host you would like to delete: ');
    start = False;
    f=open(infile, 'r')
    nf=open(r'C:\test.txt', 'w')
    myfile=str()
    myindex=list()
    mystr=str()
    count = 0
    lines = f.readlines()

    for i, line in enumerate(lines):
            if re.search(host, line):
                start = True

            if start:

                #print line
                #myindex=lines.index(line)

                myindex.append(lines.index(line))
                #myindex.append(line)
                if re.search('}',line):
                    break
    print myindex
    print type(myindex[0])

    del lines[myindex]

delete_host();

错误我

Please enter host you would like to delete: rest
[13, 14, 15, 16, 17, 18, 19, 7]
<type 'int'>

Traceback (most recent call last):
  File "C:\delete.py", line 52, in <module>
    delete_host();
  File "C:\delete.py", line 35, in delete_host
    del lines[myindex]
TypeError: list indices must be integers, not list

但是类型返回int,所以我不明白我在做什么。

答案 3 :(得分:0)

如果其他人有同样的问题我终于解决了问题。谈谈KISS原则的实际应用。感谢所有回复的人。如果搜索条件为真,则以下代码将删除dhcpd.conf文件中的主机。

    def delete_host():

        host=raw_input('Please enter host you would like to delete: ');
        start = False;
        infile= '/etc/dhcp/dhcpd.conf'
        f=open(infile, 'r')
        lines = f.readlines()
        nf = open('/var/tmp/testing','w')

        for line in lines:
                if re.search(host, line):
                        print 'if search'
                        start = True
                if start:
                        print 'is start'
                        print line
                        if re.search('}', line):
                                start = False
                                print 'false'
                else:

                        nf.write(line)
                        print 'writing'


delete_host()