限制python中的glob与bash

时间:2012-07-23 14:05:47

标签: python linux bash glob

我的程序读取像* ABC *这样的字段,并尝试将其转换为glob语句。 我在尝试限制数据时遇到问题 在linux bash和python glob库中,Glob的工作方式不同:

来自bash:

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]的预期输出不一样。
我怎样才能克服这个问题?

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以将glob表达式转换为正则表达式:

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

当然,此时您不再需要glob,因为您可以使用os.listdir()

修改

阅读globfnmatch的文档(这是glob用来匹配的文档),您的匹配似乎可以写成:

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

答案 1 :(得分:0)

查看在fnmatch.translate的实现中使用的glob.glob的输出,我认为glob被转换为不正确的正则表达式:

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

Python正则表达式不处理[[:class:]]语法;看来fnmatch.translate在可以翻译的glob模式中受到限制。