Почему мое регулярное выражение Python не извлекает относительные URL из ссылок? - PullRequest
0 голосов
/ 29 февраля 2012

У меня в Python:

links = re.match(r'''<A HREF="(\w+?\.htm)#\w*?">''', workbench)

'workbench' - это файл, считываемый в память с разделителями строк, замененными пробелами;один такой файл находится по адресу: http://pastebin.com/a0LHKXcS

Некоторые ссылки меня не интересуют;все они имеют строчные буквы «a» или «href».Насколько я могу судить, при сопоставлении с файлом в pastebin у меня должно быть много совпадений.Но пока re.match () возвращает None, а не заполненный объект MatchObject, который я могу получить для данных.Я попробовал в командной строке и сократил регулярное выражение, чтобы быть более терпимым к различиям, и поиск HREF ничего не нашел.

Как я могу настроить регулярное выражение (или другие факторы) так, чтобывызов получает заполненный объект MatchObject?

Спасибо

Ответы [ 2 ]

6 голосов
/ 29 февраля 2012

re.match пытается найти соответствие только в начале строки. Вместо этого используйте re.search.

Кроме того, lazyr прав: даже несмотря на то, что это конкретное регулярное выражение работает в данном конкретном случае для поиска конкретных обращений, в целом вам гораздо лучше полагаться на HTML-анализатор, такой как BeautifulSoup .

1 голос
/ 29 февраля 2012

Использование BeautifulSoup .

>>> import BeautifulSoup
>>> import re
>>> aa = soup.findAll("a", href=re.compile(r".*#.*"))
>>> for a in aa:
...   print a["href"]
... 
npnf214.htm#P5_18
npnf2140.htm#P6_28
npnf2141.htm#P30_306
npnf2142.htm#P257_10476
npnf2143.htm#P273_20869
npnf2144.htm#P322_41638
npnf2145.htm#P424_60362
npnf2146.htm#P453_82389
npnf2147.htm#P506_110748
npnf2148.htm#P514_110857
npnf2149.htm#P522_112870
npnf2110.htm#P538_115696
npnf2111.htm#P553_120011
npnf2112.htm#P561_131414
npnf2113.htm#P593_136014
npnf2114.htm#P681_155628
npnf2115.htm#P719_167167
npnf2116.htm#P743_173304
npnf2117.htm#P768_186497
npnf2118.htm#P839_201234
npnf2119.htm#P891_222702
npnf2120.htm#P941_235400
npnf2121.htm#P993_248248
npnf2122.htm#P1057_267070
npnf2123.htm#P1085_275404
npnf2124.htm#P1111_287892
npnf2125.htm#P1370_306192
>>> 
...