2013-03-18 3 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"덩어리가 존재할 수도 있고 존재하지 않을 수도있다 나처럼 짧은 형태로 기록 될 수 있습니다

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

그래서 나는이 같은 정규식을 작성했습니다 : : 어떤 경우에 "의 1"또는 "바다 1"

나는 4 개 캡처 그룹이 출력으로 제공하고 싶은

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

이것은 "season XX"문자열을 포함하여 완전히 지정된 파일 이름이있는 경우에만 작동합니다. "season"을 찾을 수없는 경우 group2로 "None"을 반환하는 정규식을 작성할 수 있습니까?

답변

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