如何从字符串中获取第一个IP地址

时间:2019-03-18 18:46:26

标签: python regex python-3.x

我正试图从字符串中抓取ip address并遇到问题。请帮助。
inet addr:11.11.11.11 Bcast:11.11.11.111 Mask:111.111.11.1
这是我拥有的字符串,我需要在addr旁边输入IP地址:

我尝试了以下代码,但在python中无法执行:

ip = re.findall(r'(?:\d{1,3}\.)+(?:\d{1,3})', line)并获得索引0项。

结果:这实际上没有给我任何回报

3 个答案:

答案 0 :(得分:0)

您的REGEX可能更具体,我想您可以使用类似以下内容的话:

addr:(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

在python中:

match = re.match(r'addr:(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', line)

然后您可以通过调用ip来访问match.group('ip')组。

答案 1 :(得分:0)

我注意到您的正则表达式将匹配无效的IPv4地址。

import re

string = 'inet addr:300.11.11.11  Bcast:11.11.11.111  Mask:111.111.11.1'

# your pattern 
ip_address_pattern = re.compile(r'(?:\d{1,3}\.)+(?:\d{1,3})')
find_ip_address = re.findall(ip_address_pattern, string)
if find_ip_address:
   print (find_ip_address)
   # outputs
   ['300.11.11.11', '11.11.11.111', '111.111.11.1']

我过去曾经使用过 IPv4_format 来提取有效的IPv4地址。

import re

string = 'inet addr:11.11.11.11  Bcast:11.11.11.111  Mask:111.111.11.1'

# Valid IPv4 address format
ip_address_pattern = re.compile(r'\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b')
find_ip_address = re.findall(ip_address_pattern, string)
if find_ip_address:
  print (find_ip_address)
  # outputs
  ['11.11.11.11', '11.11.11.111', '111.111.11.1']

答案 2 :(得分:0)

import re

line = "inet addr:11.11.11.11  Bcast:11.11.11.111  Mask:111.111.11.1"

pattern = r"[\d]{2}[.][\d]{2}[.][\d]{2}[.][\d]{2}[\D]"

re.findall(pattern, line)

['11.11.11.11 ']

re.findall(pattern, line)[0].strip()

'11.11.11.11'

如果列表中有多个元素,只需使用.strip()

运行list-comp
[i.strip() for i in re.findall(pattern, line)]

['11.11.11.11']

re.match()无法正常工作,因为它将尝试从字符串的开头开始匹配您的模式(请注意,您的模式不包括“ inet addr:”部分。
re.search()可以使用,但是它会丢失重复出现的元素,并且仅在成功匹配后才返回模式的第一次匹配,此外,您还必须使用filter来提取元素。

最后,解决此问题的关键在于目标的最后一个字符xx.xx.xx.xx[\D][\D]伪指令可确保该模式在索引12处查找无整数,[\s]的效果也很好,并且与空格匹配。