Когда я задал этот вопрос, я только начинал с регулярных выражений.С тех пор я полностью прочитал docs, и я просто хотел поделиться тем, что узнал.
Во-первых, то, что Rohit и F.J предложил использовать сырые строки (чтобы сделать регулярное выражение более читаемым и менее подвержены ошибкам) и компиляции регулярных выражений заранее, используя re.compile
. Для сопоставления HTML строки с идентификатором «заголовка»:
s = "<div id='header'>Some random text</div>"
Мы нуждались бы в регулярном выражении, как:
p = re.compile(r'<div[^>]*id\s*=\s*([\"\'])header\1[^>]*>(.*?)</div>')
В реализации Python в регулярном выражении, если захватывающая группа сделана вмещающей частью вашего regex в круглых скобках (...)
. Захватывающие группы фиксируют диапазон текста, который они соответствуют. Они также необходимы для обратного связывания. Поэтому в моем регулярном выражении, у меня есть две группы захвата: ([\"\'])
и (.*?)
. Первый необходим, чтобы сделать возможной обратную связь \1
. Однако использование обратных ссылок (и того факта, что они ссылаются на группу захвата) имеет последствия. Как указано в других ответах на этот вопрос, при использовании findall
на моем шаблоне p
, findall
вернется матчи из всех групп и поместить их в список кортежей:
print p.findall(s)
# [("'", 'Some random text')]
Поскольку мы хотим простой текст из между тегами HTML, это не тот результат, который мы ищем.
(Возможно, мы могли бы использовать:
print p.findall(s)[0][1]
# Some random text
Но это может быть немного надуманным.)
Так что для того, чтобы вернуть только текст из между HTML-тегами (захваченный второй группой), мы используем метод group()
на p.search()
:
print p.search(s).group(2)
# Some random text
Я прекрасно понимаю, что все, кроме самой простой HTML не должен быть обработан регулярным выражением, и инст вы должны использовать парсер. Но это был всего лишь учебный пример для понимания основ регулярного выражения в Python.
Так почему же существует более одной группы, если я использую '([" ']) ... \ 1', а не когда я просто набираю '[' '] ... ["'] '. I ' Извините, если ответ очевиден, но я весь день ломаю голову над этим. И кстати, спасибо, ваш код работает хорошо :) –