2013-07-20 11 views
8

यहाँ कोड मैं हैमैं कैसे सुनिश्चित करूं कि re.findall() सही जगह पर रुक जाए?</p> <pre><code>a='<title>aaa</title><title>aaa2</title><title>aaa3</title>' import re re.findall(r'<(title)>(.*)<(/title)>', a) </code></pre> <p>परिणाम है::

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

अगर मैं कभी मुझ वेब साइटों की खिताब पाने के लिए एक क्रॉलर तैयार किया गया है, मैं कुछ इस तरह से खत्म हो सकता है बल्कि वेबसाइट के लिए एक शीर्षक से।

मेरा सवाल है, मैं findall को एक <title></title> पर कैसे सीमित करूं?

+9

आप Regex – Achrome

+3

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

उत्तर

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

* के बाद एक ? जोड़ें, ताकि गैर लालची हो जाएगा।

13

उपयोग re.search बजाय re.findall आप केवल चाहते हैं, तो एक मैच:

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

आप सभी टैग करना चाहता था, तो आप यह गैर लालची होने के लिए बदल रहा है पर विचार करना चाहिए (यानी - .*?):

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

लेकिन वास्तव में सुंदर सूप या एलएक्सएमएल या पार्स एचटीएमएल के समान उपयोग करने पर विचार करें।

+3

यह सच है कि regexen का उपयोग कर HTML या XML पार्स करने के लिए आम तौर पर एक बुरा विचार है की बजाय HTML पार्स करने के लिए BeautifulSoup उपयोग कर सकते हैं। –

5

बजाय एक गैर लालची खोज का उपयोग करें:

r'<(title)>(.*?)<(/title)>' 

प्रश्न चिह्न संभव के रूप में कुछ वर्णों का मिलान करने कहते हैं। अब आपका findall() आपके इच्छित परिणामों में से प्रत्येक को वापस कर देगा।

http://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy

संबंधित मुद्दे