2010-07-15 9 views
0

Я пытаюсь разобрать вывод около ста строк. Формат этого выхода таков:Regex help in python

<random text> STATION "STATION_NAME_ONE": <random text> 
<random text> IP Address: 0.0.0.0 <random text> 
<SEVERAL LINES OF RANDOM TEXT> 

<random text> STATION "STATION_NAME_TWO": <random text> 
<random text> IP Address: 1.1.1.1 <random text> 
<SEVERAL LINES OF RANDOM TEXT> 

... and so on 

Я знаю IP-адрес станции, которую я ищу. Используя IP-адрес, я пытаюсь создать регулярное выражение, которое найдет название станции. Название станции может быть любой длины и может содержать любое количество цифр/букв/символов подчеркивания. Название станции всегда будет предшествовать STATION и всегда будет сопровождаться двоеточием. IP-адрес всегда будет находиться в строке, следующей за именем станции, и ему всегда будет предшествовать IP-адрес :.

Обратите внимание, что есть несколько станций с разными названиями станций и IP-адресами. «Случайный текст» может иметь любую длину и содержать любой символ/номер/букву.

До сих пор мои попытки были:

re.search('(?<=STATION).*?(?=:.*IP Address: %s)' % sta_ip, output, re.DOTALL) 

но, очевидно, это будет возвращать довольно много первое название станции каждый раз.

Как вы можете создать регулярное выражение, которое может найти указанное имя станции? Это возможно?

ответ

0

Редактировать У меня есть это. Ключ состоит в том, что имя станции и IP разделяются только одной новой строкой, поэтому мы можем жестко обозначить эту новую строку.

re.search('STATION(?P<StationName>.*?):.*?\n.*?IP Address: %s' % sta_ip, output).group("StationName") 
+0

это, к сожалению, все еще возвращает первое имя станции, независимо от того, ip. –

+0

Попробуйте мой отредактированный код, он должен работать как рекламируемый. – Josiah

+0

Хммм это сработало. Спасибо. –

0
STATION\s*"(.*?)":\s*.*?(?:\r|\n)<.*?>\s*IP Address:\s*IPHERE\s*< 

Замените IPHERE на IP-адрес и получите имя станции, извлеките первую соответствующую группу.

+0

Я не могу это вернуть группу. :( –

+0

регулярное выражение работы, поэтому он должен быть, как вы пытаетесь получить группу. Убедитесь, что вы используете правильный REGEX функцию –

+0

Быстрый вопрос, что делать кавычки делать? –

0

Try /STATION\s*?"(.*?)"\s*?:.*?IP Address:\s*?%s/
Трюк не должен быть жадным относительно соответствия. После сопоставления этого регулярного выражения имя, которое вы хотите, будет находиться в первом захвате.

+0

Хммм, я не могу получить это, чтобы вернуть группу. –