2010-05-10 13 views
18

के साथ अंतिम मिलान ढूंढें मैं स्ट्रिंग में एक साधारण पैटर्न के अंतिम अवसर से मेल खाता हूं, उदा।पाइथन नियमित अभिव्यक्ति

list = re.findall(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2") 
print "last match: ", list[len(list)-1] 

लेकिन, अगर स्ट्रिंग बहुत लंबा है, मैचों की एक बड़ी सूची उत्पन्न होता है। क्या "एएएए" के दूसरे अवसर से मेल खाने का कोई और सीधा तरीका है या क्या मुझे इस कामकाज का उपयोग करना चाहिए?

>>> s = """foo bar AAAA 
foo2 AAAA bar2""" 
>>> re.findall(r"\w+ AAAA \w+$", s) 
['foo2 AAAA bar2'] 

इसके अलावा, ध्यान दें कि list अपने चर के लिए एक बुरा नाम है के रूप में यह छाया में निर्मित प्रकार:

+6

स्ट्रिंग ('mystr [:: - 1]') को उलट करने के लिए एक और विकल्प हो सकता है और पैटर्न के विपरीत के पहले अवसर की खोज कर सकता है। – ChristopheD

+2

@ क्रिस्टोफेड, सकल! रेगेक्स की तुलना में समझने में केवल एक चीज एक पिछली है। – mlissner

उत्तर

24

आप $ कि लाइन चरित्र के अंत को दर्शाता है इस्तेमाल कर सकते हैं। एक सूची के अंतिम तत्व तक पहुंचने के लिए आप सिर्फ [-1] सूचकांक इस्तेमाल कर सकते हैं:

for match in re.finditer(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2"): 
    pass 

के बाद:

>>> lst = [2, 3, 4] 
>>> lst[-1] 
4 
+0

क्या होगा यदि मैं एक मल्टीलाइन स्ट्रिंग में आया? – SDD

+1

@ एसडीडी: यह अभी भी ठीक काम करेगा – SilentGhost

+3

यह इस तरह की इनपुट स्ट्रिंग के लिए काम नहीं करेगा: "foo bar AAAA foo2 AAAA bar2 bar3"। बेशक, हम नहीं जानते कि ऐसा मामला संभव है, हमारे पास पर्याप्त जानकारी नहीं है। – tzot

22

तुम बस सभी मैचों से अधिक पुनरावृत्ति और आखिरी मैच रखकर एक सूची के निर्माण से बच सकते हैं यह, match अंतिम मैच रखता है, और पैटर्न और खोजी गई स्ट्रिंग के सभी संयोजनों के लिए काम करता है। आप match को None पर पहले सेट करना चाहते हैं, क्योंकि यदि कोई मिलान नहीं है, तो match किसी भी मान पर सेट नहीं किया जाएगा।

+0

यह बहुत सारे उपयोग में बहुत उपयोगी है। आप आम तौर पर एक पैटर्न के सभी घटनाओं को प्रतिस्थापित करना चाहते हैं, फिर इनपुट स्ट्रिंग के अंतिम भाग को कस्टम प्रक्रिया करें। –

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