我想解析文件的行并获取IP地址。
我使用re.search,并且我想同时打印两者:
-IP的
-没有IP时的字符串“ None”
考虑到该文件对应于变量logfile,我编写了以下代码段:
import re, sys
regexip = r'(?!91.134.143.128)[0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}'
logfile = '91.12.13.14, 65.12.45.78, aaa'
my_iplist = re.findall(regexip,logfile)
for ii in my_iplist:
if re.search (regexip,logfile):
print ii
else:
print 'None'
问题是我只能得到这些结果...
91.12.13.14
65.12.45.78
...而我想拥有:
91.12.13.14
65.12.45.78
无
该else语句不起作用。我想我做错了什么,但我不知道是什么..
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
else
将永远不会执行,因为my_iplist
仅包含有效IP。 re.findall
将返回所有匹配项。所有不匹配的字符串都不会返回。
要获得所需的输出,您需要将字符串除以", "
,然后针对正则表达式进行测试:
lines = logfile.split("\n")
nested_ips = map(lambda x: x.split(", "), lines)
ips = reduce(list.__add__, nested_ips)
for ii in ips:
if re.search (regexip,ii):
print ii
else:
print 'None'
您还应该将正则表达式更改为具有开始和结束锚点:
regexip = r'^(?!91.134.143.128)[0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}[.][0-9]{2,3}$'
答案 1 :(得分:1)
首先,使用r'(?<![0-9])(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(?![0-9])'
来实际匹配valid IPs。匹配后,您可以过滤掉“不受欢迎的” IP。
现在,如果每行只有一个IP,请像这样使用re.search
import sys, re
regexip = r'(?<![0-9])(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(?![0-9])'
result = []
with open(your_log_file_path, 'r') as f:
for line in f:
m = re.search(regexip, line)
if not m:
result.append(None)
else:
if m.group() != "91.134.143.128":
result.append(m.group())
else:
result.append(None)
如果您有几个不受欢迎的IP,请在列表中进行定义:
uwelcome_ips = ["91.134.143.128", "91.134.143.129"]
然后
if m.group() not in uwelcome_ips:
答案 2 :(得分:0)
re.findall
不会保留不匹配的内容,因此您必须逐行检查:
for i in logfile.split(','):
match = re.search(regexip, i)
if match:
print match.group(0)
else:
print "None"
由于您的日志文件是文件,因此您可以改为在行上循环:
for line in open("logfile.log", "r"):
match = re.search(regexip, line.strip())
if match:
print match.group(0)
else:
print "None"
这是我的logfile.log
文件的样子:
91.12.13.14ezrtqsyu
65.12.45.78 aert
aaa
输出:
91.12.13.14
65.12.45.78
None