我在想出匹配特定情况的正则表达式时遇到问题。我有大约 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')
