2015-03-18 2 views
2

Я пытаюсь использовать регулярное выражение, чтобы найти адрес прокси на веб-сайте. В настоящее время я использую этот кусок регулярного выражения (\d{1,3}\.){3}\d{1,3}:(\d+). Он работает на regexr.com и в возвышенном тексте, но когда я пытаюсь использовать его в Python, он работает не так, как ожидалось.Регулярное задание кортежа и неполное совпадение

Это кусок кода, я использую:

p = re.compile("(\d{1,3}\.){3}\d{1,3}:(\d+)") 
ipCandidates = p.findall(soupString) 

Он должен возвращать прокси как этот 120.206.182.172:8123 но он возвращает кортежи как этот ('44.', '3128'). Что я могу сделать, чтобы исправить это?

спасибо.

+0

Почему у вас есть группы захвата? Что вы ожидали от них? Если вы хотите не захватывать группы, это '(?: Stuff)', а не '(stuff)'. – user2357112

+0

Честно говоря, я не знаю. Я нашел регулярное выражение онлайн, и он отлично работал во всем, кроме Python. Я не очень владею регулярным выражением. –

ответ

4

re.findall() возвращает только содержимое групп захвата, а не весь матч (если в вашем регулярном выражении есть такие группы).

Затем вы повторяете группу захвата три раза, а это означает, что сохраняется только третье повторение (остальные два перезаписываются).

Измените регулярное выражение

p = re.compile(r"(?:\d{1,3}\.){3}\d{1,3}:\d+") 

и вы получите целые матчи.

Если вы хотите кортежи отдельных submatches (без точек и толстой кишки), вы можете сделать это, тоже, но вы не можете использовать повторение тогда:

p = re.compile(r"(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):(\d+)") 

Кроме того, всегда использовать сырые строки для регулярных выражений, поэтому последовательности запуска регулярных выражений и последовательности escape-последовательности строк не могут быть сбиты с толку.

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