删除包含特定字符串的行

时间:2012-07-01 20:36:34

标签: python

我有一个脚本,我想用它从文件中删除包含特定IP地址的行。这是:

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if not hostIP in line:
        print line

然而,这种作品有两件事我想解决。

  1. 此脚本将删除所有匹配项,因此在

    之前的示例中

    127.0.0.1
        127.0.0.11
        127.0.0.111
        192.168.0.1

    如果我使用“127.0.0.11”的输入运行它,它将删除“127.0.0.11”和“127.0.0.111”,这不是我想要的。

  2. 此脚本也不处理csv文件。我需要将其从每个行只是的文件和每行的IP地址(根据上面的列表)中删除,还需要一个csv文件,其中第一个字段是违规的IP地址。我尝试在strip函数中使用正则表达式[\s\,]+,但这不能正常工作,并在将剩余的行重新打印回文件时添加一个空行。

  3. 我知道这可能有很多要问,但我仍然试图找到解决Python奇迹的方法。

5 个答案:

答案 0 :(得分:3)

您只需要在测试中更加具体。对于第一个示例测试,整行(在一个条带之后)等于ip地址(比它包含它更严格 - 从而解决你的第一个问题)。对于第二行,将逗号字符上的每一行拆分,并测试第一个元素是否等于您的IP地址字符串。

所以对于第一个文件类型:

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if line != hostIP:
        sys.stdout.write(line)

对于csv文件类型:

for line in fileinput.input(hostsFileLoc,inplace =1):
    elements = line.split(",")
    first = elements[0].strip()
    if first != hostIP:
        sys.stdout.write(line)

答案 1 :(得分:3)

如果你剥离字符串,你可以测试它们是否相等,而不是它是否包含输入。

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    # Only print if they are not the same
    if hostIP != line:
        print line

答案 2 :(得分:2)

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if hostIP!=line:
        print line

对于csv文件:

for line in fileinput.input(hostsFileLoc,inplace =1):
    line = line.strip()
    if not line.startswith(hostIP+','):
        print line

答案 3 :(得分:1)

我会使用正则表达式从行中提取IP地址,并根据您要查找的IP进行检查。

ValidIpAddressRegex =“^(([0-9] | [1-9] [0-9] | 1 [0-9] {2} | 2 [0-4] [0-9] | 25 [ 0-5])){3}([0-9] |。[1-9] [0-9] | 1 [0-9] {2} | 2 [0-4] [0-9] | 25 [0-5])$“

http://docs.python.org/library/re.html

对于这么简单的任务来说,这可能太多了,但除此之外,你必须分别处理每个边缘情况,这可能会产生一个肮脏而复杂的代码。特别是如果您将来必须添加其他过滤器(例如,像热门名称)。

至于CSV文件,为什么不简单地解析文件并删除你想要的任何条目?

http://docs.python.org/library/csv.html

答案 4 :(得分:1)

那么我们不想要哪一行?那些包含ip-address的行!

此正则表达式为r'127\.0\.0\.1'。我们必须逃避点(\.)以使它们成为字面点,因为点在正则表达式中具有特殊含义。

但我们只是指地址位于开头(^)或非数字(\D)后面的行,如果后面是行尾({{ 1}})或非数字。

这样做:$

r'(^|\D)127\.0\.0\.1(\D|$)'