2009/07/24

re - регулярные выражения в python

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

Про квантификацию: жадная, ленивая, ревнивая. Ревнивой я вообще никогда не пользовался, а вот про жадную пару слов. К примеру, символ "точка" означает любой символ. Выражение ".+" означает один и более символов - вплоть до конца анализируемого фрагмента. С таким выражением далеко не уедешь, поясню почему. Имеем следующий фрагмент html-кода:
<a href='www.site.com'>GSOM</a> <b>пум-пу-рум</b>
Если применить к этому фрагменту выражение <a href='(.+)'> с целью получения ссылки, то оно жадно зохавает всю строку, ибо последний знак ">" встречается и в самом в конце! Уталить жадность точки поможет вопросительный знак. И вот, если применить выражение "<a href='(.+?)'>", то получим то, что надо: www.site.com

Вообще, у меня выражение (.+?) - одно из самых востребованных при парсинге html-кода.
В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:
import urllib2, re

search = 'ivinside.blogspot.com'
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
req = urllib2.Request("http://www.google.ru/search?q=" + search + "&start=0&ie=utf-8&oe=utf-8", None, headers)
response = urllib2.urlopen(req)

for url in re.findall(r'<class="r"><href="(.+?)">')
Итак регулярное выражение '<class="r"><href="(.+?)">' откуда я его взял? Посмотрел в исходнике выдачи гугла и увидел нечто похожее на <h3 class=r<>a href="http://site.com" target=_blank class=l ... и применил к этому своё излюбленное точка-плюсик-вопросительный-знак. То-то же.

3 comments:

  1. for url in re.findall(чего-то-тут-не-хватает в конце)

    ReplyDelete
  2. Благодарю!
    Приятно читать на русском :)

    ReplyDelete
  3. > for url in re.findall(чего-то-тут-не-хватает в конце)
    поправил

    ReplyDelete