fnmatch如何精确实现seq模式中的匹配任意字符
我有一段使用 os.walk 的代码
search = self.search.get_text()
top = '/home/bludiescript/tv-shows'
for dirpath, dirnames, filenames in os.walk(top):
for filename in filenames:
if fnmatch.fnmatch(filename, search)
print os.path.join([dirpath, filename])
在 Python 的文档里,它告诉你可以用 [seq] 这种模式来匹配任何字符序列,但无论我怎么尝试实现,都会出现某种错误,或者根本没有结果。
那么,正确的实现方式是什么,才能匹配到搜索中的字符序列,并打印出匹配的文件?
我尝试过的实现方式
if fnmatch.fnmatch(filename, [search]) error i got was typeerror unhasable type : 'list'
if fnmatch.fnmatch[filename, search] error i got was typeerror fnmatch function is not subscriptable
if fnmatch.fnmatch([filename, search]) error typeerror fnmatch takes two arguments 1 given
if fnmatch.fnmatch([filename], search) error typeerror expected string or buffer
if fnmatch.fnmatch([search], filename) error typeerror expected string or buffer
if fnmatch.fnmatch(filename, search, [seq]) error nameerror global name seq not defined
if fnmatch.fnmatch(filename, '[search]')
没有错误,但没有产生任何结果
搜索的值
hello, mkv, merry 1, 2, 3, 4, 5, 6, 7,等等...
1 个回答
15
fnmatch 是用来实现 Unix 系统中通配符语法的。也就是说,你在 ls
命令中可以输入的任何内容,在这里也能用:
>>> fnmatch.fnmatch("qxx", "[a-z]xx")
True
>>> fnmatch.fnmatch("abc", "a??")
True
>>> fnmatch.fnmatch("abcdef", "a*f")
True
>>> fnmatch.fnmatch("abcdef", "a*[f-k]")
True
要记住,fnmatch 只是一个字符串匹配的操作。如果你觉得使用其他的模式风格,比如正则表达式(regex)更方便,那就直接用正则表达式来匹配你的文件名吧。