Если вы ищете только один:
import re
match = re.search(r'href=[\'"]?([^\'" >]+)', s)
if match:
print match.group(0)
Если у вас есть длинная строка, и вы хотите, чтобы в ней был каждый экземпляр шаблона:
import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
print ', '.join(urls)
Где s
- строка, в которой вы ищете совпадения.
Быстрое объяснение битов регулярного выражения:
r'...'
является «необработанной» строкой. Это избавит вас от необходимости беспокоиться о побеге персонажей так же, как обычно. (\
особенно - в необработанной строке \
- это просто \
. В обычной строке вам придется каждый раз делать \\
, и это получает old в регулярных выражениях .)
"href=[\'"]?
" говорит, что соответствует "href =", возможно, за ним следует '
или "
. «Возможно», потому что трудно сказать, насколько ужасен HTML, на который вы смотрите, и кавычки не являются строго обязательными.
Включение следующего бита в "()
" говорит о том, чтобы сделать его "группой", что означает разделить его и вернуть нам отдельно. Это просто способ сказать: «Это та часть паттерна, которая мне интересна».
"[^\'" >]+
" говорит, что соответствует любым символам, которые не '
, "
, >
или пробел. По сути это список символов, которые являются концом URL. Это позволяет нам не пытаться написать регулярное выражение, которое надежно соответствует полному URL, что может быть немного сложным.
Предложение в другом ответе использовать BeautifulSoup неплохо, но оно вводит более высокий уровень внешних требований. Кроме того, это не поможет вам в вашей заявленной цели изучения регулярных выражений, и я бы предположил, что этот конкретный проект парсинга html является лишь частью.
Это довольно легко сделать:
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_to_parse)
for tag in soup.findAll('a', href=True):
print tag['href']
После установки BeautifulSoup, в любом случае.