2013-03-18 80 views
7

我有以下問題從文件名相匹配所需要的數據是這樣的:蟒正則表達式可選捕獲組

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」塊可以或可以不存在,或者可以寫在短形式,如「第1條」或「海洋1」

在任何情況下,我想有4個捕捉組給予作爲輸出:

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

所以我寫了一個正則表達式是這樣的:

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

這隻適用於當我有完全指定的文件名,包括可選的「賽季XX」字符串。 如果找不到「season」,是否可以編寫一個返回「None」作爲group2的正則表達式?

回答

29

這是很容易足以使季節組可選的:使用非捕獲組((?:...))加上0或1量詞(?

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

。我確實必須使第一組非貪婪,以防止它匹配名稱的season部分。

我還將easonart可選字符串轉換爲非捕獲可選組,而不是字符類。

結果:

>>> 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

我是一個正則表達式左右新手,我是幹什麼錯誤試圖使可選的‘季節’及編號,而不是分別比 – user2181741 2013-03-18 10:53:40