带re.search的循环语句中的if / else子句不起作用(python)

时间:2019-04-12 08:50:08

标签: regex python-2.7

我想解析文件的行并获取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语句不起作用。我想我做错了什么,但我不知道是什么..
任何帮助将不胜感激。
谢谢!

3 个答案:

答案 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