LINUX.ORG.RU

Подскажите как правильно написать регулярку


0

1

Ковырял себе утилитку парсер для грабежа открытых прокси списков (блокировки не дремлют, а хочется удобства). В общем надо в таком тексте:

 <font class=«spy14»>118.174.149.118<script type=«text/javascript»>document.write(«<font class=spy2>:<\/font>»+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo)+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo))</script><font class=«spy2»>:</font>8080</font>

Найти ip адрес и порт, превратив это все в стандартный ip:port Пишу регулярку:

([0-9]{1,3}\.){3}[0-9]{1,3}(?:[\s\S]*)[0-9]{2,4}

Он находит все начиная с 118.174.149.118 и заканчивая 8080. А как же "?:" то есть «найти и забыть»? То, что ip в регулярке может быть и не валидным мне безразлично, надо что бы хоть как то работало. В общем подскажите решение.

Ответ на: комментарий от ziemin

Это если бы мне надо было конкретно этот док «привести к виду», а задача найти в произвольном тексте совпадение «сначала ip адрес, потом идет порт в котором от 2 до 4 цифр». Регулярка с этим должна справиться.

i3draven ★★
() автор топика
Ответ на: комментарий от i3draven

Регулярка с этим должна справиться

На счётчик её поставь. Не вернёт результат через неделю - сломай колено.

ziemin ★★
()
Ответ на: комментарий от i3draven

На самом деле правильно тебя посылают: все равно кривой код выйдет, да и use-cases ничего общественно-полезного не предвещает. Но все же, да, не регулярка):

http://doc.scrapy.org/en/latest/topics/selectors.html

anonymous
()

В андроидом хрома есть фишка «сжатие трафика». Пользуйся, пока можно.

chg ★★★★★
()

Ну это смотря на чем пишешь, да. В пайтоне можно сделать как-то так:

>>> re.findall("(([0-9]{1,3}\.){3}[0-9]{1,3}).+?([0-9]{2,4})", "  <font class=«spy14»>118.174.149.118<script type=«text/javascript»>document.write(«<font class=spy2>:<\/font>»+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo)+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo))</script><font class=«spy2»>:</font>8080</font> ")
[('118.174.149.118', '149.', '8080')]
>>> 
Думаю, как распарсить выхлоп findall через groups разберешься.

Lilly
()
Ответ на: комментарий от Lilly

p.s. Но это быстрый хак, разумеется, по красивому нужно сделать так, чтобы регулярка не находила второе значение.

Lilly
()
~ > cat 1.html
<html><body><font class="spy14">118.174.149.118<script type="text/javascript">document.write("<font class=spy2>:<\/font>"+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo)+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo))</script><font class="spy2">:</font>8080</font></body></html>

~ > xmllint --html --xpath '//font[@class="spy14"]/descendant-or-self::*[not(self::script)]/text()' 1.html
118.174.149.118:8080

С тебя три бакса.

mix_mix ★★★★★
()

m#(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:<script.*>.+?</script>|<.+?>)*:(?:<.+?>)*(\d+)#

arto ★★
()
14 мая 2014 г.
echo '<html><body><font class="spy14">118.174.149.118<script t">document.write("<font class=spy2>:<\/font>"+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo)+(Zero7NineSix^One5Seven)+(One2FiveOne^TwoSixTwo))</script><font class="spy2">:</font>8080</font></body></html>' | 
perl -ne 'm/(([\d]{1,3}\.){3}[\d]{1,3}).*\D(\d+)\D/; print "$1 $3"'
118.174.149.118 8080
ed__ed
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.