fnmatch如何精确实现seq模式中的匹配任意字符

4 投票
1 回答
27801 浏览
提问于 2025-04-17 03:01

我有一段使用 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)更方便,那就直接用正则表达式来匹配你的文件名吧。

撰写回答