27

次のようなファイル名から必要なデータを一致させるには、次の問題があります。

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

「season XX」チャンクは、存在する場合と存在しない場合があります。また、「s 1」や「seas 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」文字列を含む、完全に指定されたファイル名がある場合にのみ機能します。「シーズン」が見つからない場合、「なし」を group2 として返す正規表現を書くことは可能ですか?

4

1 に答える 1

56

シーズン グループをオプションにするのは簡単です。

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

非キャプチャ グループ ( (?:...)) と 0 または 1 個の量指定子 ( ?) を使用します。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')
于 2013-03-18T10:39:20.583 に答える