我有一个脚本,我想用它从文件中删除包含特定IP地址的行。这是:
for line in fileinput.input(hostsFileLoc,inplace =1):
line = line.strip()
if not hostIP in line:
print line
然而,这种作品有两件事我想解决。
此脚本将删除所有匹配项,因此在
之前的示例中 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”,这不是我想要的。
此脚本也不处理csv文件。我需要将其从每个行只是的文件和每行的IP地址(根据上面的列表)中删除,还需要一个csv文件,其中第一个字段是违规的IP地址。我尝试在strip函数中使用正则表达式[\s\,]+
,但这不能正常工作,并在将剩余的行重新打印回文件时添加一个空行。
我知道这可能有很多要问,但我仍然试图找到解决Python奇迹的方法。
答案 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文件,为什么不简单地解析文件并删除你想要的任何条目?
答案 4 :(得分:1)
那么我们不想要哪一行?那些包含ip-address的行!
此正则表达式为r'127\.0\.0\.1'
。我们必须逃避点(\.
)以使它们成为字面点,因为点在正则表达式中具有特殊含义。
但我们只是指地址位于开头(^
)或非数字(\D
)后面的行,如果后面是行尾({{ 1}})或非数字。
这样做:$
r'(^|\D)127\.0\.0\.1(\D|$)'