Skip to main content
 首页 » 编程设计

Python 正则表达式适用于 Regex101,但不适用于 Python 2

2025年02月15日28jiqing9006

我创建了一个正则表达式来匹配电视节目的中英文名称。

我的正则表达式位于 https://regex101.com/r/rBJHDG .它在正则表达式上完美运行。但是,此正则表达式在 Python 2 中不起作用。

例如字符串亿万.Billions.S01E01.中英字幕.HDTVrip.1024X576.mp4.

正则表达式不匹配 亿万 as name_chs in expect。相反,它将 亿万.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'} 

第二个问题:

如何去掉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` 

请您参考如下方法:

看起来问题在于正则表达式测试器包含 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}) 

现在当您打印英文名称时,它只会是单词,因为点在它自己的捕获组中。