我创建了一个正则表达式来匹配电视节目的中英文名称。
我的正则表达式位于https://regex101.com/r/rBJHDG,它在正则表达式上工作完美,但是这个正则表达式在 python2 中不起作用。
有关示例,字符串亿万.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4
的正则表达式是不匹配亿万
的name_chs
在期待,而不是它匹配亿万.Billions
的name_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'}
第二个问题:
怎么去掉中文名和英文名之间的.
in name_en
which。
# 亿万.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`
看起来问题在于正则表达式测试器包含global
和multiline
标志,但您的代码没有。如果您在正则表达式测试器中取消选中这两个标志,您会发现测试器与您当前的结果相匹配。
你可以试试 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})
现在,当您打印英文名称时,它只会是单词,因为点在它自己的捕获组中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句