我试图从一个字符串中抓住一个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项。
结果:这实际上并没有给我任何回报
您的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')
组。
我注意到你的正则表达式将匹配无效的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']
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]
同样良好并且它与空格匹配。