2015-04-20 2 views
0

Я ищу лучший способ проанализировать данные IP и подсети от ifocnfig.python regex для анализа вывода ifconfig из разных локалей

Я не хочу искать его на основе inet addr или Mask:, потому что, когда применяется другой языковой стандарт, регулярное выражение выходит из строя при изменении строк.

Вот образец текста:

eth0  Link encap:Ethernet HWaddr 00:18:F3:BE:18:1E 
      inet addr:192.168.10.15 Bcast:192.168.10.255 Mask:255.255.255.0 
      inet6 addr: fe80::218:f3ff:febe:181e/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:39456 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:45730 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:25457904 (24.2 Mb) TX bytes:6540945 (6.2 Mb) 
      Interrupt:20 

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 
      inet6 addr: ::1/128 Scope:Host 
      UP LOOPBACK RUNNING MTU:16436 Metric:1 
      RX packets:182 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:182 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:12812 (12.5 Kb) TX bytes:12812 (12.5 Kb) 

Я попробовал несколько способов для делать это, например, используя \d+\.\d+\.\d+\.\d+, но не смогли найти наилучший способ. Нужна помощь по этому поводу.

+2

разместить свои попытки. –

+0

@ также разместите свой файл, в котором вы хотите найти –

+0

Я пробовал следующее: mac = re.search ('\ w \ w: \ w \ w:. + \ N', ifconfig) parsedMac = mac.group() print (parsedMac) Но это сработало только для Mac, не работает для маски ip и подсети – Sandy

ответ

0

Я могу предложить использовать это регулярное выражение:

\b\d+(?:\.\d+){3}\b 

Он должен быть использован с Multiline опции.

См. demo.

В результате внутри группы 1. Посмотрите этот sample code:

import re 
p = re.compile(ur'\b\d+(?:\.\d+){3}\b', re.MULTILINE) 
test_str = u"eth0  Link encap:Ethernet HWaddr 00:18:F3:BE:18:1E\n   inet addr:192.168.10.15 Bcast:192.168.10.255 Mask:255.255.255.0\n   inet6 addr: fe80::218:f3ff:febe:181e/64 Scope:Link\n   UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\n   RX packets:39456 errors:0 dropped:0 overruns:0 frame:0\n   TX packets:45730 errors:0 dropped:0 overruns:0 carrier:0\n   collisions:0 txqueuelen:1000\n   RX bytes:25457904 (24.2 Mb) TX bytes:6540945 (6.2 Mb)\n   Interrupt:20\n\nlo  Link encap:Local Loopback\n   inet addr:127.0.0.1 Mask:255.0.0.0\n   inet6 addr: ::1/128 Scope:Host\n   UP LOOPBACK RUNNING MTU:16436 Metric:1\n   RX packets:182 errors:0 dropped:0 overruns:0 frame:0\n   TX packets:182 errors:0 dropped:0 overruns:0 carrier:0\n   collisions:0 txqueuelen:0\n   RX bytes:12812 (12.5 Kb) TX bytes:12812 (12.5 Kb)" 
print re.findall(p, test_str) 

Выход:

[u'192.168.10.15', u'192.168.10.255', u'255.255.255.0', u'127.0.0.1', u'255.0.0.0'] 
+0

Это помогает! Большое спасибо. Я искал также извлечение как IP, так и маски. – Sandy

+0

Хорошо, я исправил это. Теперь он также извлекает маски и Bcasts. –

0
import re 
tempstr='blah blah 172.16.13.35 blah blah 23.85.85.94' 

matches = re.findall(r'\d+[.]\d+[.]\d+[.]\d+', tempstr) 
for match in matches: 
    print match 

Этот код напечатает все найденные ip в заданной строке tempstr. выхода программы 172.16.13.35 23.85.85.94

+0

Это также будет захватывать значения 'Mask' и' Bcast'. Я думаю, OP не хочет их. –

+0

Это прекрасно! И служит моей цели. Большое спасибо! – Sandy

 Смежные вопросы

  • Нет связанных вопросов^_^