3

まず、正規表現は初めてです。しかし、これまでのところ、私は彼らに恋をしています。正規表現を使用して、レンダリング エンジンから取得した画像ファイル名から情報を抽出しています。これまでのところ、この正規表現はうまく機能しています...

_([a-z]{2,8})_?(\d{1,2})?(\.|_)(\d{3,10})\.([a-z]{2,6})$

次のようなファイル名で split() メソッドを使用すると...

image_file_name_ao.0001.exr

私は私が使用できる素敵な小さなリストを取得します....

['image_file_name', 'gi', None, '.', '0001', 'exr', '']

私の唯一の懸念は、常に最後に空の文字列を返すことです。正規表現をどのように変更または操作しても、常にリストの最後に空の文字列が表示されます。私はそれを無視して先に進むことに完全に満足していますが、私の質問は、正規表現で何か間違ったことをしているのですか、それとも最後の空の文字列を渡さないようにするためにできることはありますか? お時間をいただきありがとうございます。

4

3 に答える 3

3

不思議ではありません。このsplitメソッドは、正規表現の出現時に文字列を分割します(さらにグループ範囲を返します)。また、正規表現は行の終わり(最後にで示される$)まで到達する部分文字列にのみ一致するため、ファイル名の最後で分割するものはなく、空の接尾辞('')があります。

式ですでにグループ" (...)"を使用している場合は、を使用することもできますre.match(regex, string)。これにより、MatchObjectインスタンスが提供され、そこから次の方法でグループを含むタプルを取得できますgroups()

# additional group up front
reg='(\S*)_([a-z]{2,8})_?(\d{1,2})?(\.|_)(\d{3,10})\.([a-z]{2,6})$' 
print re.match(reg, filename).groups() # request tuple of group matches

編集:本当に申し訳ありませんが、あなたのパターンが最初の文字以降のファイル名の文字列と一致していないことに気づきませんでした。私は私の答えでそれを拡張しました。を使用したアプローチを維持したい場合split()は、ファイル名の最後の部分が一致しないために分割されるように、元のパターンを変更することもできます。

于 2013-02-28T20:16:03.993 に答える
1

filter()を使用できます

あなたの例を考えると、これは次のように機能します。

def f(x):
    return x != '' 

filter
(
    f,
    re.split('_([a-z]{2,8})_?(\d{1,2})?(\.|_)(\d{3,10})\.([a-z]{2,6})$',
    'image_file_name_ao.0001.exr')
)
于 2015-08-10T16:09:18.327 に答える
1

興味深い質問です。

正規表現のパターンを少し変更しました:

import re

reg = re.compile('_([a-z]{2,8})'

                 '_?(\d\d?)?'

                 '([._])'
                 '(\d{3,10})'
                 '\.'
                 '(?=[a-z]{2,6}$)')

for ss in ('image_file_name_ao.0001.exr',
           'image_file_name_45_ao.0001.exr',
           'image_file_name_ao_78.0001.exr',
           'image_file_name_ao78.0001.exr'):
    print '%s\n%r\n' % ( ss, reg.split(ss) )

結果

image_file_name_ao.0001.exr
['image_file_name', 'ao', None, '.', '0001', 'exr']

image_file_name_45_ao.0001.exr
['image_file_name_45', 'ao', None, '.', '0001', 'exr']

image_file_name_ao_78.0001.exr
['image_file_name', 'ao', '78', '.', '0001', 'exr']

image_file_name_ao78.0001.exr
['image_file_name', 'ao', '78', '.', '0001', 'exr']
于 2013-02-28T21:48:15.200 に答える