Python/正则表达式 - 匹配 .#,#.在字符串中

2023-11-26

我可以使用什么正则表达式来匹配“.#,#.”在一个字符串内。它可能存在于字符串中,也可能不存在。一些具有预期输出的示例可能是:

Test1.0,0.csv      -> ('Test1', '0,0', 'csv')         (Basic Example)
Test2.wma          -> ('Test2', 'wma')                (No Match)
Test3.1100,456.jpg -> ('Test3', '1100,456', 'jpg')    (Basic with Large Number)
T.E.S.T.4.5,6.png  -> ('T.E.S.T.4', '5,6', 'png')     (Doesn't strip all periods)
Test5,7,8.sss      -> ('Test5,7,8', 'sss')            (No Match)
Test6.2,3,4.png    -> ('Test6.2,3,4', 'png')          (No Match, to many commas)
Test7.5,6.7,8.test -> ('Test7', '5,6', '7,8', 'test') (Double Match?)

最后一个不太重要,我只希望 .#,#.会出现一次。我正在处理的大多数文件,我希望属于第一到第四个示例,所以我对这些最感兴趣。

谢谢您的帮助!


您可以使用正则表达式\.\d+,\d+\.找到该模式的所有匹配项,但是您需要做一些额外的事情才能获得您期望的输出,特别是因为您想要处理.5,6.7,8.作为两场比赛。

这是一种可能的解决方案:

def transform(s):
    s = re.sub(r'(\.\d+,\d+)+\.', lambda m: m.group(0).replace('.', '\n'), s)
    return tuple(s.split('\n'))

例子:

>>> transform('Test1.0,0.csv')
('Test1', '0,0', 'csv')
>>> transform('Test2.wma')
('Test2.wma',)
>>> transform('Test3.1100,456.jpg')
('Test3', '1100,456', 'jpg')
>>> transform('T.E.S.T.4.5,6.png')
('T.E.S.T.4', '5,6', 'png')
>>> transform('Test5,7,8.sss')
('Test5,7,8.sss',)
>>> transform('Test6.2,3,4.png')
('Test6.2,3,4.png',)
>>> transform('Test7.5,6.7,8.test')
('Test7', '5,6', '7,8', 'test')

要在没有匹配项时也拆分文件扩展名,您可以使用以下命令:

def transform(s):
    s = re.sub(r'(\.\d+,\d+)+\.', lambda m: m.group(0).replace('.', '\n'), s)
    groups = s.split('\n')
    groups[-1:] = groups[-1].rsplit('.', 1)
    return tuple(groups)

这将是与上面相同的输出,除了'Test2.wma'变成('Test2', 'wma'),具有类似的行为'Test5,7,8.sss' and 'Test5,7,8.sss'.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python/正则表达式 - 匹配 .#,#.在字符串中 的相关文章

随机推荐