我有很多名字如下的文件:
<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])
但它不是一个非常干净的解决方案,特别是当未来可能的尺寸值增加时。
如何使用正则表达式?
答案 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)
可能不是最聪明的,但应该很容易阅读。
字符串:
^.*
_
\d+
by
\d+
\.(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
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]