正则表达式在Pythex上运行良好,但在Python中却无法正常运行

发布于 2021-01-29 14:56:02

我在pythex上使用了以下正则表达式进行测试:

(\d|t)(_\d+){1}\.

它工作正常,我主要对第2组感兴趣。成功显示如下:

pythex演示

但是,我无法让Python真正向我显示正确的结果。这是MWE:

fn_list = ['IMG_0064.png',
           'IMG_0064.JPG',
           'IMG_0064_1.JPG',
           'IMG_0064_2.JPG',
           'IMG_0064_2.PNG',
           'IMG_0064_2.BMP',
           'IMG_0064_3.JPEG',
           'IMG_0065.JPG',
           'IMG_0065.JPEG',
           'IMG-20150623-00176-preview-left.jpg',
           'IMG-20150623-00176-preview-left_2.jpg',
           'thumb_2595.bmp',
           'thumb_2595_1.bmp',
           'thumb_2595_15.bmp']

pattern = re.compile(r'(\d|t)(_\d+){1}\.', re.IGNORECASE)

for line in fn_list:
    search_obj = re.match(pattern, line)
    if search_obj:
        matching_group = search_obj.groups()
        print matching_group

输出为空。

但是,上面的pythex清楚地显示了每个返回的两个组,第二个应该存在并且产生了更多文件。我究竟做错了什么?

关注者
0
被浏览
106
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要使用re.search(),不re.match()re.search()匹配字符串中的任何地方,而re.match()仅匹配开头。

    import re
    
    fn_list = ['IMG_0064.png',
               'IMG_0064.JPG',
               'IMG_0064_1.JPG',
               'IMG_0064_2.JPG',
               'IMG_0064_2.PNG',
               'IMG_0064_2.BMP',
               'IMG_0064_3.JPEG',
               'IMG_0065.JPG',
               'IMG_0065.JPEG',
               'IMG-20150623-00176-preview-left.jpg',
               'IMG-20150623-00176-preview-left_2.jpg',
               'thumb_2595.bmp',
               'thumb_2595_1.bmp',
               'thumb_2595_15.bmp']
    
    pattern = re.compile(r'(\d|t)(_\d+){1}\.', re.IGNORECASE)
    
    for line in fn_list:
        search_obj = re.search(pattern, line)  # CHANGED HERE
        if search_obj:
            matching_group = search_obj.groups()
            print matching_group
    

    结果:

    ('4', '_1')
    ('4', '_2')
    ('4', '_2')
    ('4', '_2')
    ('4', '_3')
    ('t', '_2')
    ('5', '_1')
    ('5', '_15')
    

    由于您要编译正则表达式,因此可以search_obj = pattern.search(line)代替search_obj = re.search(pattern, line)。至于您的正则表达式本身,r'([\dt])(_\d+)\.'它等同于您正在使用的正则表达式,并且更加简洁。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看