2017-03-07 29 views
2

私はテレビ番組の中国語と英語の名前に一致する正規表現を作成します。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'} 

2番目の質問:

中国名と英語名の間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フラグを含むが、あなたのコードにはないということであるように見えます。正規表現テスターでこれらの2つのフラグをオフにすると、テスターが現在の結果と一致することがわかります。

あなたが試みることができる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)

とあなたの2番目の質問については

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英語の名前を印刷するときは、ドットがそれ自身のキャプチャグループに含まれているため、単語になります。

関連する問題