0

次のような名前のファイルがたくさんあります。

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

そのため、名前の部分はさまざまで、拡張子は常に jpg ですが、大文字にすることもできます。の x と y に使用できる値は限られています<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

最も賢い re ではないかもしれませんが、読みやすいはずです。

文字列:

  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

4800by2304

于 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 に答える