Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Khớp mẫu tên file kiểu Unix trong Python

Ở đây chúng ta sẽ thấy cách thực hiện kỹ thuật khớp mẫu (pattern matching) kiểu Unix shell bằng Python. Có một module gọi là fnmatch, dùng để thực hiện công việc này. Module này so sánh tên file với một mẫu, sau đó trả về True hoặc False tùy theo khớp hay không.

Để sử dụng, trước tiên cần nhập module thư viện chuẩn fnmatch:

import fnmatch

Trong terminal Unix, có một số ký tự đại diện (wildcards) để khớp mẫu. Chúng như sau:

  • * (Asterisk) – khớp mọi thứ.
  • ? (Question Mark) – khớp một ký tự đơn.
  • [seq] (Sequences) – khớp các ký tự trong dãy.
  • [!seq] (Not in Sequence) – khớp các ký tự không có trong dãy.

Nếu muốn tìm kiếm dấu * hoặc ? như ký tự thường, phải dùng dạng [*] hoặc [?].

Phương thức fnmatch()

Phương thức fnmatch() nhận hai đối số: tên file (filename) và mẫu (pattern). Hàm này kiểm tra xem tên file có khớp với mẫu cho trước hay không. Khi hệ điều hành phân biệt chữ hoa/thường (case sensitive), các tham số sẽ được chuẩn hóa thành chữ hoa hoặc chữ thường trước khi so khớp.

Mã ví dụ

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)))

Kết quả

$ 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
$

Phương thức filter()

Phương thức filter() cũng nhận hai tham số. Thứ nhất là danh sách tên (names), thứ hai là mẫu (pattern). Mẫu này tìm danh sách tên file khớp từ danh sách tất cả tên file.

Mã ví dụ

import fnmatch
import os

file_pattern = 'test_f*'
files = os.listdir('./unix_files')
match_file = fnmatch.filter(files, file_pattern)
print('Tất cả file:' + str(files))
print('\nFile khớp:' + str(match_file))

Kết quả

$ python3 310.UNIX_filename.py
Tất cả file:['test_file5.txt', 'test_file2.png', 'test_file1.txt', 'another_file.txt', 'TEST_FILE4.txt', 'abc.txt', 'test_file3.txt']
File khớp:['test_file5.txt', 'test_file2.png', 'test_file1.txt', 'test_file3.txt']
$

Phương thức translate()

Phương thức translate() nhận một tham số là mẫu (pattern). Ta dùng hàm này để chuyển đổi một mẫu kiểu shell sang kiểu mẫu khác để khớp bằng biểu thức chính quy (regular expressions) trong Python.

Mã ví dụ

import fnmatch, re

file_pattern = 'test_f*.txt'
unix_regex = fnmatch.translate(file_pattern)
regex_object = re.compile(unix_regex)
print('Biểu thức chính quy: ' + str(unix_regex))
print('Đối tượng Match: ' + str(regex_object.match('test_file_abcd123.txt')))

Kết quả

$ python3 310.UNIX_filename.py
Biểu thức chính quy: (?s:test_f.*\.txt)\Z
Đối tượng Match: <_sre.SRE_Match object; span=(0, 21), match='test_file_abcd123.txt'>
$