我的程序读取像* 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]的预期输出不一样。
我怎样才能克服这个问题?
非常感谢
答案 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()
。
修改强>
阅读glob
和fnmatch的文档(这是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模式中受到限制。