2013-05-24 2 views
-6

У меня есть документ (простой текст), из которого я пытаюсь извлечь все IP-адреса. Я смог извлечь их с помощью регулярных выражений, но он также захватывает большое количество номеров версий. Я попытался использовать string.find(), но для этого мне нужно найти escape-символ, используемый для конца строки (IP-адреса всегда являются последней вещью в строке), а escape-символ, используемый для конца строки, неизвестен меня. Кто-нибудь знает, как я могу вытащить эти адреса?Как искать документ для IP-адресов

+9

Как насчет размещения куска документа и кода, который вы написали до сих пор? – SpankMe

+1

«escape-символ, используемый для конца строки» - вы имеете в виду разделитель строк, обычно '\ n' или' \ r \ n'? –

+0

искать 're' и использовать эту ссылку http://answers.oreilly.com/topic/318-how-to-match-ipv4-addresses-with-regular-expressions/ – 0x90

ответ

3

Если адреса всегда на конце линии, а затем закрепить на том, что:

ip_at_end = re.compile(r'(?:[0-9]{1,3}\.){3}[0-9]{1,3}$', re.MULTILINE) 

Это регулярное выражение соответствует только октета (4 набора цифр с точками между ними) в конце линия.

Демо:

>>> import re 
>>> ip_at_end = re.compile(r'(?:[0-9]{1,3}\.){3}[0-9]{1,3}$', re.MULTILINE) 
>>> example = '''\ 
... Only addresses on the end of a line match: 123.241.0.15 
... Anything else doesn't: 124.76.67.3, even other addresses. 
... Anything that is less than a dotted quad also fails, so 1.1.4 
... does not match but 1.2.3.4 
... will. 
... ''' 
>>> ip_at_end.findall(example) 
['123.241.0.15', '1.2.3.4'] 
+0

как насчет ipv6? http://stackoverflow.com/a/6276240/1031417 – 0x90

+0

0x90: Я принимал IPv4, потому что ОП требовал, чтобы номера версий мешали; IP-адреса, отформатированные IPv6, с использованием ':' в качестве разделителя, редко принимаются за версии программного обеспечения. –

+0

OP также отмечен как ipv4. –

2

Описания

это будет соответствовать и проверить ipv4 адрес, и обеспечить индивидуальное octects находится в диапазоне 0-255

(?:([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])

enter image description here

Отказ от ответственности

Да, я понимаю, что ОП запросил решение Python. Это PHP решение включается только, чтобы показать, как работает выражение

пример PHP

<?php 
$sourcestring="this is a valid ip 12.34.56.78 
this is not valid ip 12.34.567.89"; 
preg_match_all('/(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/i',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

$matches Array: 
(
    [0] => Array 
     (
      [0] => 12.34.56.7 
     ) 

) 
+0

Как вы создали этот удивительный граф? Есть ли сайт, который делает это для ввода регулярных выражений? – SethMMorton

+0

@ SethMMorton. Да, для этого я использую http://www.debuggex.com/. Если вы используете его, имейте в виду, что он поддерживает выражения типа javascript и не понимает lookbehinds. –

+0

@denomales Не уверен, что вы видели его с тех пор, как вы отправили этот ответ, но debuggex теперь может сгенерировать изображение для вас, поэтому вам не придется сталкиваться с проблемой копирования/вставки/обрезки :) –

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

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