2013-03-18 5 views
7

मैं इस तरह फ़ाइल नाम से आवश्यक डेटा मिलान निम्न समस्या:अजगर regex वैकल्पिक कब्जा समूह

miniseries.season 1.part 5.720p.avi 
miniseries.part 5.720p.avi 
miniseries.part VII.720p.avi  # episode or season expressed in Roman numerals 

"मौसम XX" हिस्सा या नहीं भी हो सकता है या जैसे संक्षिप्त रूप में लिखा जा सकता, हो सकता है

group1 : miniseries 
group2 : 1 (or None) 
group3 : 5 
group4 : 720p.avi 

तो मैं इस तरह एक regex लिखा है: "एस 1" या "समुद्र 1"

किसी भी मामले में मैं 4 कैप्चर समूहों आउटपुट के रूप में दे रही है चाहते हैं

+०१२३५१६४१०
(^.*)\Ws[eason ]*(\d{1,2}|[ivxlcdm]{1,5})\Wp[art ]*(\d{1,2}|[ivxlcdm]{1,5})\W(.*$) 

यह केवल तभी काम करता है जब मेरे पास वैकल्पिक "सीजन XX" स्ट्रिंग समेत एक पूर्ण निर्दिष्ट फ़ाइल नाम होता है। क्या एक रेगेक्स लिखना संभव है जो "सीजन" नहीं मिला है तो समूह 2 के रूप में "कोई नहीं" लौटाता है?

उत्तर

29

यह आसान मौसम समूह वैकल्पिक बनाने के लिए पर्याप्त है: एक गैर पर कब्जा समूह ((?:...)) प्लस 0 या 1 परिमाणक (?) का उपयोग कर

(^.*?)(?:\Ws(?:eason)?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art)?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$) 

। नाम के season से मेल खाने से रोकने के लिए मुझे पहले समूह को गैर-लालची बनाना पड़ा।

मैंने eason और art वैकल्पिक वर्गों को चरित्र वर्गों के बजाय गैर-कैप्चरिंग वैकल्पिक समूहों में भी बनाया।

परिणाम:

>>> import re 
>>> p=re.compile(r'(^.*?)(?:\Ws(?:eason)?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art)?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)', re.I) 
>>> p.search('miniseries.season 1.part 5.720p.avi').groups() 
('miniseries', '1', '5', '720p.avi') 
>>> p.search('miniseries.part 5.720p.avi').groups() 
('miniseries', None, '5', '720p.avi') 
>>> p.search('miniseries.part VII.720p.avi').groups() 
('miniseries', None, 'VII', '720p.avi') 
+0

मैं regex के बारे में नौसिखिया हूँ, और मैं 'अलग से गलत कर रहा था एक साथ वैकल्पिक "मौसम" और संख्या बनाने की कोशिश कर के बजाय – user2181741

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