Python中的Unix文件名模式匹配

在这里,我们将看到如何使用Python获得UNIX shell样式模式匹配技术。有一个名为fnmatch的模块,用于完成工作。此模块用于将文件名与模式进行比较,然后根据匹配结果返回True或False。

首先要使用它,我们需要将其导入fnmatch标准库模块。

import fnmatch

在Unix终端中,有一些通配符可以匹配模式。这些如下-

  • '*'星号用于匹配所有内容。

  • '?' 问号用于匹配单个字符。

  • [seq]序列用于匹配序列中的字符

  • [!seq]不在序列中用于匹配序列中不存在的字符。

如果我们想搜索星号或问号作为字符,那么我们必须像这样使用它们:[*]或[?]

fnmatch()方法

fnmatch()方法有两个参数,分别是文件名和模式。此功能用于检查文件名是否与给定的模式匹配。如果操作系统区分大小写,则在匹配之前,参数将被标准化为大写或小写字母。

范例程式码

import fnmatch
import os
file_pattern = 'test_f*'
files = os.listdir('./unix_files')
for filename in files:
   print('File: {}\t: {}'.format(filename, fnmatch.fnmatch(filename, file_pattern)))

输出结果

$ python3 310.UNIX_filename.py
File: test_file5.txt : True
File: test_file2.png : True
File: test_file1.txt : True
File: another_file.txt : False
File: TEST_FILE4.txt : False
File: abc.txt : False
File: test_file3.txt : True
$

filter()方法

filter()方法还具有两个参数。第一个是名称,第二个是模式。此模式从所有文件名列表中找到匹配的文件名列表。

范例程式码

import fnmatch
import os
file_pattern = 'test_f*'
files = os.listdir('./unix_files')
match_file = fnmatch.filter(files, file_pattern)
   print('All files:' + str(files))
      print('\nMatched files:' + str(match_file))

输出结果

$ python3 310.UNIX_filename.py
All files:['test_file5.txt', 'test_file2.png', 'test_file1.txt', 'another_file.txt', 'TEST_FILE4.txt', 'abc.txt', 'test_file3.txt']
Matched files:['test_file5.txt', 'test_file2.png', 'test_file1.txt', 'test_file3.txt']
$

translate()方法

translate()方法采用一个参数。该参数是一个模式。我们可以使用此函数将外壳样式模式转换为另一种模式,以使用Python中的正则表达式进行匹配。

范例程式码

import fnmatch, re
file_pattern = 'test_f*.txt'
unix_regex = fnmatch.translate(file_pattern)
regex_object = re.compile(unix_regex)
   print('Regular Expression:' + str(unix_regex))
      print('Match Object:' + str(regex_object.match('test_file_abcd123.txt')))

输出结果

$ python3 310.UNIX_filename.py
Regular Expression:(?s:test_f.*\.txt)\Z
Match Object:<_sre.SRE_Match object; span=(0, 21), match='test_file_abcd123.txt'>
$