Skip to main content
 首页 » 编程设计

python之确保组匹配不以特定字符结尾的正则表达式

2025年05月04日32JeffreyZhao

我在想出匹配特定情况的正则表达式时遇到问题。我有大约 4 种格式的电视节目列表:

  • 名称.Of.Show.S01E01
  • 名称.Of.Show.0101
  • 名称.Of.Show.01x01
  • 名称.Of.Show.101

我要匹配的是节目名称。我的主要问题是我的正则表达式将节目名称与前面的“.”相匹配。我的正则表达式如下:

"^([0-9a-zA-Z\.]+)(S[0-9]{2}E[0-9]{2}|[0-9]{4}|[0-9]{2}x[0-9]{2}|[0-9]{3})" 

一些例子:

>>> import re 
 
>>> SHOW_INFO = re.compile("^([0-9a-zA-Z\.]+)(S[0-9]{2}E[0-9]{2}|[0-9]{4}|[0-9]{2}x[0-9]{2}|[0-9]{3})") 
>>> match = SHOW_INFO.match("Name.Of.Show.S01E01") 
>>> match.groups() 
('Name.Of.Show.', 'S01E01') 
>>> match = SHOW_INFO.match("Name.Of.Show.0101") 
>>> match.groups() 
('Name.Of.Show.0', '101') 
>>> match = SHOW_INFO.match("Name.Of.Show.01x01") 
>>> match.groups() 
('Name.Of.Show.', '01x01') 
>>> match = SHOW_INFO.match("Name.Of.Show.101") 
>>> match.groups() 
('Name.Of.Show.', '101') 

所以问题是如何避免第一组以句号结尾?我意识到我可以简单地做:

var.strip(".") 

但是,这不处理“Name.Of.Show.0101”的情况。有没有办法改进正则表达式以更好地处理这种情况?

提前致谢。

请您参考如下方法:

我认为这样做可以:

>>> regex = re.compile(r'^([0-9a-z.]+)\.(S[0-9]{2}E[0-9]{2}|[0-9]{3,4}|[0-9]{2}x[0-9]{2})$', re.I) 
>>> regex.match('Name.Of.Show.01x01').groups() 
('Name.Of.Show', '01x01') 
>>> regex.match('Name.Of.Show.101').groups() 
('Name.Of.Show', '101') 

ETA:当然,如果您只是想从受信任的字符串中提取不同的位,您可以只使用字符串方法:

>>> 'Name.Of.Show.101'.rpartition('.') 
('Name.Of.Show', '.', '101')