2013-07-20 7 views
8

Oto kod mam:Jak upewnić się, że funkcja re.findall() zatrzymuje się we właściwym miejscu?

a='<title>aaa</title><title>aaa2</title><title>aaa3</title>' 
import re 
re.findall(r'<(title)>(.*)<(/title)>', a) 

Wynikiem jest:

[('title', 'aaa</title><title>aaa2</title><title>aaa3', '/title')] 

Jeśli kiedykolwiek zaprojektował robota, żeby mnie tytuły stron internetowych, mogę skończyć z czymś takim raczej niż tytuł strony internetowej.

Moje pytanie brzmi: w jaki sposób ograniczyć findall do pojedynczego <title></title>?

+9

Można użyć BeautifulSoup do analizowania HTML zamiast Regex – Achrome

+3

http://stackoverflow.com/a/1732454/193892 –

Odpowiedz

2
re.findall(r'<(title)>(.*?)<(/title)>', a) 

Dodaj ? po *, więc będzie nie chciwi.

13

Zastosowanie re.search zamiast re.findall jeśli tylko chcesz jeden mecz:

>>> s = '<title>aaa</title><title>aaa2</title><title>aaa3</title>' 
>>> import re 
>>> re.search('<title>(.*?)</title>', s).group(1) 
'aaa' 

Jeśli chciałeś wszystkie znaczniki, wówczas należy rozważyć zmianę to być non-chciwy (tj - .*?):

print re.findall(r'<title>(.*?)</title>', s) 
# ['aaa', 'aaa2', 'aaa3']  

Ale naprawdę rozważ użycie BeautifulSoup lub lxml lub podobnego do parsowania HTML.

+3

To prawda, że ​​za pomocą regexen do analizowania HTML lub XML jest zazwyczaj zły pomysł. –

Powiązane problemy