正则表达式匹配ifconfig eth0输出中首次出现的ip

时间:2018-12-13 10:34:04

标签: regex python-2.7

我正在尝试匹配系统ifconfig eth0输出中第一次出现的ip。我尝试了以下正则表达式,但没有用。

ifconfig输出

eth0   
Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
inet addr:10.20.30.40  Bcast:10.20.30.254  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:66196498 errors:0 dropped:32831 overruns:0 frame:0
TX packets:61850152 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:41122659013 (41.1 GB)  TX bytes:28800593238 (28.8 GB)
Interrupt:22 Memory:f6ae0000-f6b00000

正则表达式已尝试:

re.match("^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$",output)

re.match(("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"),output)

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为re.match是执行此操作的合理方法。您可能遇到的一个潜在问题是不使用DOTALL模式。按照您的输入字符串,第一个IP地址不会出现在第一行,因此我们希望点在所有行上都匹配。

input = "Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx\ninet addr:10.20.30.40  Bcast:10.20.30.254  Mask:255.255.255.0"

match = re.match(r'^.*?(\d+\.\d+\.\d+\.\d+)', input, re.DOTALL)

if match:
    print "first IP: ", match.group(1)

first IP:  10.20.30.40

答案 1 :(得分:0)

您可以使用addr:([\d.]+),即:

x = """
eth0   
Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
inet addr:10.20.30.40  Bcast:10.20.30.254  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:66196498 errors:0 dropped:32831 overruns:0 frame:0
TX packets:61850152 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:41122659013 (41.1 GB)  TX bytes:28800593238 (28.8 GB)
Interrupt:22 Memory:f6ae0000-f6b00000
"""
m = re.findall("addr:([\d.]+)", x, re.IGNORECASE)
if m:
    print m[0]
# 10.20.30.40


正则表达式说明

enter image description here


或者,您也可以使用socket来确定本地ip地址:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("1.1.1.1", 80))
print s.getsockname()[0]
s.close()