我在pythex上使用了以下正则表达式进行测试:
(\d|t)(_\d+){1}\.
它工作正常,我主要对第2组感兴趣。成功显示如下:
但是,我无法让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清楚地显示了每个返回的两个组,第二个应该存在并且产生了更多文件。我究竟做错了什么?
您需要使用re.search(),不re.match()。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+)\.'它等同于您正在使用的正则表达式,并且更加简洁。
search_obj = pattern.search(line)
search_obj = re.search(pattern, line)
r'([\dt])(_\d+)\.'