【问题标题】:python regex optional capture grouppython regex 可选捕获组
【发布时间】:2013-03-06 15:59:47
【问题描述】:

我遇到以下问题,匹配来自文件名的所需数据,如下所示:

miniseries.season 1.part 5.720p.avi
miniseries.part 5.720p.avi
miniseries.part VII.720p.avi     # episode or season expressed in Roman numerals

“season XX”块可能存在也可能不存在,或者可以写成简短的形式,例如“s 1”或“seas 1”

无论如何,我都希望有 4 个捕获组作为输出:

group1 : miniseries
group2 : 1 (or None)
group3 : 5
group4 : 720p.avi

所以我写了一个这样的正则表达式:

(^.*)\Ws[eason ]*(\d{1,2}|[ivxlcdm]{1,5})\Wp[art ]*(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)

这仅在我有一个完全指定的文件名时有效,包括可选的“season XX”字符串。 如果找不到“season”,是否可以编写一个返回“None”作为 group2 的正则表达式?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    将季节组设为可选很容易:

    (^.*?)(?:\Ws(?:eason )?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art )?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)
    

    使用非捕获组 ((?:...)) 加上 0 或 1 量词 (?)。我确实必须让第一组不贪婪,以防止它与名称的season 部分匹配。

    我还将easonart 可选字符串设置为非捕获可选组而不是字符类。

    结果:

    >>> import re
    >>> p=re.compile(r'(^.*?)(?:\Ws(?:eason )?(\d{1,2}|[ivxlcdm]{1,5}))?\Wp(?:art )?(\d{1,2}|[ivxlcdm]{1,5})\W(.*$)', re.I)
    >>> p.search('miniseries.season 1.part 5.720p.avi').groups()
    ('miniseries', '1', '5', '720p.avi')
    >>> p.search('miniseries.part 5.720p.avi').groups()
    ('miniseries', None, '5', '720p.avi')
    >>> p.search('miniseries.part VII.720p.avi').groups()
    ('miniseries', None, 'VII', '720p.avi')
    

    【讨论】:

    • 我是一个关于正则表达式的新手,我试图将可选的“季节”和数字放在一起而不是单独制作是错误的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2014-01-31
    • 2010-10-04
    • 2022-01-13
    • 2012-09-22
    • 2021-11-15
    • 2017-08-03
    相关资源
    最近更新 更多