2017-03-07 95 views
2

我創建了一個正則表達式來匹配電視節目的中文和英文名稱。python正則表達式在regex101上工作,但不能在python2中工作

我的正則表達式位於https://regex101.com/r/rBJHDG,它在正則表達式上很完美,但是這個正則表達式在python2中不起作用。

有關示例,串億萬.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4 正則表達式不匹配億萬如預期name_chs,而不是它匹配億萬.Billionsname_en

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標誌,但您的代碼不。如果你在正則表達式測試中取消選中這兩個標誌,你會發現測試者符合你當前的結果。

你可以嘗試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當您打印英文名稱時,它只會是單詞,因爲該點位於自己的捕獲組中。

相關問題