0

我有许多名称如下的文件:

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

因此,名称部分各不相同,扩展名始终为 jpg,但也可以大写。x 和 y in 的值可能有限<x>by<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])

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

如何使用正则表达式?

4

3 回答 3

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)
于 2013-09-18T15:27:16.273 回答
0

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

字符串:

  1. 可以从任何东西开始^.*
  2. 必须有一个下划线_
  3. 后跟一个数字(至少由 1 个数字组成)\d+
  4. 接下来是'by'by
  5. 后跟一个数字(至少由 1 个数字组成)\d+
  6. 以 .jpg 或 . 结尾 JPG\.(jpg|JPG)$

(?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

4800乘2304

于 2013-09-18T15:39:38.390 回答
-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]
于 2013-09-18T15:29:02.147 回答