在python和bash中限制glob

在python和bash中限制glob,python,linux,bash,glob,Python,Linux,Bash,Glob,我的程序读取一个类似于*ABC*的字段,并尝试将其转换为glob语句。 我在试图限制数据时遇到问题。 Glob在linux bash和python 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]: glo

我的程序读取一个类似于*ABC*的字段,并尝试将其转换为glob语句。 我在试图限制数据时遇到问题。
Glob在linux bash和python 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]没有相同的预期输出
我如何克服这个问题


非常感谢

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

import re
regex=re.compile(r'.*FOO.*V7[^\d].*\.txt')
print filter(lambda x: regex.match(x), glob.glob("*"))
当然,此时您不再需要
glob
,因为您可以使用
os.listdir()

编辑

阅读
glob
和的文档(glob使用这些文档进行匹配),您的匹配似乎可以写成:

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

还有。

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

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

Python正则表达式不处理
[[:class:]
语法;似乎
fnmatch.translate
在can translate中的全局模式中受到限制。

谢谢@mgilson,但我希望用户在csv文件中填写
*ABC*
字段。对于普通用户来说,
r.*FOO.*V7[^\d].\.txt'
这一行看起来有点令人沮丧(并不是说
[![:digit:]
更友好,但它更容易阅读)。非常感谢@mgilson!你的台词
glob.glob('*FOO*V7[!0123456789]*')
恰到好处@多拉,我同意。不幸的是,python的fnmatch并不匹配所有的shell globbing(尽管并非所有shell glob都相同)。fnmatch也不会处理花括号(
{}
),这在技术上是一种shell扩展,但扩展顺序依赖于shell(例如,
bash
csh
不同)。我认为你必须服从于bash所能做的一部分。(或者编写自己的解析器…恶心;^))