在这里,我们将看到如何使用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'> $