0

私のプログラムは *ABC* のようなフィールドを読み取り、それを glob ステートメントに変換しようとします。データを制限しようとすると問題が発生します。
Glob は Linux bash と python glob ライブラリで同じようには機能しません:

バッシュから:

bash_level$ ls *FOO*V7*
baz_FOO_V7.txt  baz_FOO_V777.txt 
bash_level$ ls *FOO*V7[![:digit:]]* 
baz_FOO_V7.txt

ipython から:

In [1]: import glob
In [2]: glob.glob("*FOO*V7*.txt")
Out[2]: ['baz_FOO_V7.txt', 'baz_FOO_V777.txt']
In [3]: glob.glob("*FOO*V7[![:digit:]]*.txt")
Out[3]: []

結論:
Out[3] は期待される出力と同じではありません。
どうすればこの問題を克服できますか?

どうもありがとう

4

2 に答える 2

1

glob 式を正規表現に変換できます。

import re
regex=re.compile(r'.*FOO.*V7[^\d].*\.txt')
print filter(lambda x: regex.match(x), glob.glob("*"))

もちろん、代わりにglob使用できるので、この時点ではもう必要ありませんos.listdir()

編集

globおよびfnmatch (glob がマッチングを行うために使用するもの)のドキュメントを読むと、マッチは次のように記述できるようです。

glob.glob('*FOO*V7[!0123456789]*')

同じように。

于 2012-07-23T14:13:43.260 に答える
0

fnmatch.translateの実装で使用されるの出力を見るglob.globと、グロブが正しくない正規表現に変換されていると思います。

>>> fnmatch.translate("*FOO*V7[![:digit:]]*")
'.*FOO.*V7[^[:digit:]\\].*\\Z(?ms)'

[[:class:]]Python 正規表現は構文を処理しません。fnmatch.translate翻訳できるグロブパターンが制限されているようです。

于 2012-07-23T14:28:02.773 に答える