2017-03-07 2 views
2

저는 TV 프로그램의 중국어 및 영어 이름과 일치하는 정규식을 만듭니다.python regex는 regex101에서 작동하지만 python2에서는 작동하지 않습니다.

내 정규식은 https://regex101.com/r/rBJHDG에 있으며 정규식에서 완벽하게 작동하지만 정규식은 python2에서 작동하지 않습니다. 예를 들어

, 문자열 亿万.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4 정규식 대신이 name_en亿万.Billions 일치 기대에 name_chs亿万과 일치하지 않습니다.

In [68]: r = '^(?P<name_chs>(?:[\\u3007\\u4e00-\\u9fff\\u3400-\\u4dbf\\uf900-\\ufaff]+)(?=\\.))?(?P<name_en>\\S+).S(?P<season>\\d{2})E(?P<episode>\\d{2})' 

In [69]: re.match(r, u'亿万.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4').grou 
    ...: pdict() 
Out[69]: 
{'episode': u'01', 
'name_chs': None, 
'name_en': u'\u4ebf\u4e07.Billions', 
'season': u'01'} 

두 번째 질문 :

방법 name_en.을 제거 할 수있는 중국 이름과 영어 이름 사이에있다. 그것은 문제처럼 보인다

# 亿万.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4 
Full match 0-18 `亿万.Billions.S01E01` 
Group `name_chs` 0-2 `亿万` 
Group `name_en` 2-11 `.Billions` <---- This DOT! 
Group `season` 13-15 `01` 
Group `episode` 16-18 `01` 

답변

1

는 정규식 테스터가 globalmultiline 플래그를 포함하지만 코드가 없다는 것입니다. regex 테스터에서 두 플래그를 선택 해제하면 테스터가 현재 결과와 일치한다는 것을 알 수 있습니다.

당신은 시도 할 수 r = '^(?P<name_chs>(?:[\\u3007\\u4e00-\\u9fff\\u3400-\\u4dbf\\uf900-\\ufaff]+)(?=\\.))?(?P<name_en>\\S+).S(?P<season>\\d{2})E(?P<episode>\\d{2})', re.MULTILINE)

와 두 번째 질문에 대해서는

re.search(r, u'亿万.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4').grou 
    ...: pdict() 

: 난 그냥 그 영어 이름 앞에 (.)을 추가하여 자신의 캡처 그룹의 점 만들 것

, 이렇게 ...

^(?P<name_chs>(?:[\u3007\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]+)(?=\.))?(.)(?P<name_en>\S+).S(?P<season>\d{2})E(?P<episode>\d{2}) 

아니요 w 영어 이름을 인쇄 할 때 점이 자체 캡처 그룹에 있기 때문에 단어 만 나타납니다.

관련 문제