Regex:如何从字符串中只提取第一个IP地址(在Python中)

2024-10-01 13:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

给定以下字符串(或类似字符串,其中一些字符串可能包含多个IP地址):

from mail2.oknotify2.com (mail2.oknotify2.com. [208.83.243.70]) by mx.google.com with ESMTP id dp5si2596299pdb.170.2015.06.03.14.12.03

我希望在Python中提取第一个也是唯一一个IP地址。当在nregex.com上试用类似([0-9]{2,}\.){3}([0-9]{2,}){1}的第一次尝试时,看起来几乎正常,与IP地址匹配良好,但也与大致类似IP地址的其他子字符串匹配(170.2015.06.03.14.12.03)。但是,当相同的模式传递给re.compile/re.findall时,结果是:

[(u'243.', u'70'), (u'06.', u'03')]

很明显,regex并不好。我如何改进它,使它更整洁,并捕获所有的IPV4地址,我如何使它只匹配第一个?

非常感谢。


Tags: 字符串fromrecomidbywithgoogle
2条回答

您需要的regex是r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'。这将捕获4个由点分隔的1到4位数字。

如果IP号总是在字符串中的其他数字之前,则可以使用非贪婪函数(如re.find)来避免选择它。相反,re.findall将同时捕获208.83.243.70015.06.03.14

你同意用括号来标出IP号码吗?如果是,您可以将regex更改为r'\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]'。那样比较安全。

re.search与以下模式一起使用:

>>> s = 'from mail2.oknotify2.com (mail2.oknotify2.com. [208.83.243.70]) by mx.google.com with ESMTP id dp5si2596299pdb.170.2015.06.03.14.12.03'
>>> import re
>>> re.search(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', s).group()
'208.83.243.70'

相关问题 更多 >