0

我的程序读取 *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] 没有相同的预期输出。
我该如何克服这个问题?

非常感谢

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()来代替。

编辑

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

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

也是。

于 2012-07-23T14:13:43.260 回答
0

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

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

Python 正则表达式不处理[[:class:]]语法;看来fnmatch.translate只能翻译在 glob 模式中。

于 2012-07-23T14:28:02.773 回答