Regex在Pythex上运行良好,但在Python中运行不正常

时间:2015-08-12 21:43:59

标签: python regex

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

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

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

pythex demo

然而,我无法让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清楚地显示了两个返回的组,第二个应该存在并且击中了更多的文件。我做错了什么?

2 个答案:

答案 0 :(得分:7)

您需要使用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+)\.'等同于你正在使用的那个,并且更清晰。

答案 1 :(得分:1)

您需要使用以下代码:

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'([\dt])(_\d+)\.', re.IGNORECASE) # OPTIMIZED REGEX A BIT

for line in fn_list:
    search_obj = pattern.search(line)  # YOU NEED SEARCH WITH THE COMPILED REGEX
    if search_obj:
        matching_group = search_obj.group(2) # YOU NEED TO ACCESS GROUP 2 IF YOU ARE INTERESTED JUST IN GROUP 2
        print matching_group

请参阅IDEONE demo

至于正则表达式,(\d|t)([\dt])相同,但后者效率更高。此外,{1}在正则表达式中是多余的。