将IP与Regex匹配

时间:2014-01-16 18:17:06

标签: python regex python-2.7

我正在尝试显示日志文件的日期时间和IP地址:

Apr 20 07:03:53 123.345.45.123
^             ^ ^            ^
|---datetime--| |-----IP-----|   

我的代码:

datetimeRegex = re.compile(r'^\w{3}\s\d\d\s\d\d:\d\d:\d\d')

IPRegex = re.compile(r'\d+.\d+.\d+.\d{1,3}')

f = open("logfile.log","r")

count = 0

for line in f.readlines():
    datetime = re.match(datetimeRegex, line)
    IPaddr = re.match(IPRegex, line)
    if datetime and IPaddr:
        count += 1
        print str(count) + ":" + str(datetime.group()) + "IP: " + str(IPaddr.group())

我试图查看哪些内容不匹配,我认为IPaddr不匹配,因为我从if语句中删除了IPaddr,我的输出会打印日期。当我添加IPaddr时,什么都不打印。所以我认为我没有正确匹配我的IP地址。然而,我在一个在线正则表达式测试器上尝试了一个示例IP和我的正则表达式,它似乎工作。我的REGEX中缺少什么东西吗?或者我的逻辑可能有问题?如果有更快或更有效的方法来解析日志文件,我愿意接受建议。

2 个答案:

答案 0 :(得分:3)

.的所有用法替换为\.

单个句点是正则表达式中的特殊字符,表示“任何字符”。如果你想要一个文字句号,你需要使用\字符来逃避它。

IPRegex = re.compile(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
ip = "192.168.1.1"

matches = IPRRegex.match(ip)
[OUT] <_sre.SRE_Match object at 0x0000000003349578>

答案 1 :(得分:1)

您应该使用re.search代替re.match,因为re.match仅在行的开头匹配,而re.search会在字符串中的任何位置找到匹配项。

如果你稍微调整你的正则表达式(转义.,它们是正则表达式中的通配符并匹配除了换行符之外的所有东西,为datetimeRegex添加不必要的锚点,因为你将这个用于{ {1}},将re.match\d\d?和IP正则表达式等日期匹配,以接受更多有效的IP)

Jan 1 12:34:56