我正在尝试匹配系统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)
谢谢!
答案 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
正则表达式说明
或者,您也可以使用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()