Регулярное выражение для соответствия первому появлению ip из вывода ifconfig eth0 - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь сопоставить первое вхождение ip из вывода ifconfig eth0 системы.Я попробовал следующее регулярное выражение, но оно не сработало.

ifconfig output :

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 голосов
/ 13 декабря 2018

Вы можете использовать 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


Regex Объяснение:

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()
0 голосов
/ 13 декабря 2018

Я думаю, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...