Python正则表达式匹配字符串模式并返回子字符串

时间:2013-09-18 15:11:31

标签: python regex

我有很多名字如下的文件:

<some name>_2536by1632.jpg
<some name1>_4800by2304.JPG
<some name2>_904by904.jpg

因此,名称部分不同,扩展名总是jpg,但它也可以是大写字母。 <x>by<y>中x和y的值可能有限,我以此格式列出了该列表:

possible_sizes = [ (2536,1632), (4800,2304), ...]

我需要测试文件名是否属于这种模式,如果是,那么我需要返回<x>by<y>字符串的值。

截至目前,我在不使用正则表达式的情况下执行此操作。像这样:

for item in possible_sizes:
    if "_{0}by{1}.jpg".format(item[0],item[1]) in filename.lower():
        dimension = "{0}by{1}".format(item[0],item[1])

但它不是一个非常干净的解决方案,特别是当未来可能的尺寸值增加时。

如何使用正则表达式?

3 个答案:

答案 0 :(得分:0)

你可以使用Python的字符串方法:

import os

# O(1) lookup time
possible_sizes = frozenset([(2536, 1632), (4800, 2304), ...])

name, extension = os.path.splitext(filename)
title, size = filename.rsplit('_')
width, height = map(int, size.split('by'))

if (width, height) in possible_sizes:
    print(width, height)

答案 1 :(得分:0)

可能不是最聪明的,但应该很容易阅读。

字符串:

  1. 可以从任何^.*
  2. 开始
  3. 必须有一个下划线_
  4. 后跟一个数字(至少由1位数组成)\d+
  5. 接下来是'by'by
  6. 后跟一个数字(至少由1位数组成)\d+
  7. 以.jpg或结尾。 JPG \.(jpg|JPG)$
  8. (?P<X> ....) makes a match accessible by the name X.

    Leads to this expression "^.*_((?P<X>\d+)by(?P<Y>\d+))\.(jpg|JPG)$"

    示例程序:

    import re
    
    possible_sizes = [ ( 2536, 1632 ), ( 4800, 2304 )]
    names = ["<some name>_2536by1632.jpg", "<some name1>_4800by2304.JPG", "<some name2>_904by904.jpg"]
    pattern = "^.*_((?P<X>\d+)by(?P<Y>\d+))\.(jpg|JPG)$"
    
    for name in names:
        matchobj = re.match( pattern, name )
        if matchobj:
            if ( int( matchobj.group( "X" ) ), int( matchobj.group( "Y" ) ) ) in possible_sizes:
                print matchobj.group( 1 )
    

    Output

    2536by1632

    4800by2304

答案 2 :(得分:-1)

这不符合你的问题的精神,但我认为它确实有效 -

possible_sizes = { "_2536by1632.jpg" : (2536,1632), "_4800by2304.jpg" : (4800,2304)}
for filename in filenames:
    if filename.endswith in possible_sizes:
        return possible_sizes[filename]