Computer >> Máy Tính >  >> Lập trình >> Python

Đối sánh mẫu tên tệp Unix bằng Python

Ở đây chúng ta sẽ xem cách chúng ta có thể lấy các kỹ thuật đối sánh mẫu kiểu shell UNIX bằng Python. Có một mô-đun được gọi là fnmatch , được sử dụng để thực hiện công việc. Mô-đun này được sử dụng để so sánh tên tệp với một mẫu, sau đó trả về Đúng hoặc Sai tùy theo các kết quả phù hợp.

Để sử dụng nó, trước tiên, chúng tôi cần nhập fnmatch mô-đun thư viện tiêu chuẩn.

import fnmatch

Trong thiết bị đầu cuối Unix, có một số ký tự đại diện để khớp với các mẫu. Những thứ này giống như bên dưới -

  • ‘*’ Dấu hoa thị được dùng để khớp mọi thứ.
  • Dấu hỏi
  • ‘?’ là để so khớp một ký tự.
  • [seq] Chuỗi được sử dụng để khớp các ký tự trong chuỗi
  • [! seq] Không có trong chuỗi được sử dụng để đối sánh các ký tự không có trong chuỗi.

Nếu chúng ta muốn tìm kiếm dấu hoa thị hoặc dấu chấm hỏi dưới dạng ký tự, thì chúng ta phải sử dụng chúng như sau:[*] hoặc [?]

Phương thức fnmatch ()

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

Mã mẫu

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

Đầu ra

$ 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ố. Cái đầu tiên là tên và cái thứ hai là mẫu. Mẫu này tìm danh sách các tên tệp phù hợp từ danh sách tất cả các tên tệp.

Mã mẫu

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

Đầu ra

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

Phương thức translate ()

Phương thức translate () nhận một tham số. Tham số là một mẫu. Chúng ta có thể sử dụng hàm này để chuyển đổi một mẫu kiểu shell sang một kiểu mẫu khác để phù hợp bằng cách sử dụng các biểu thức chính quy trong Python.

Mã mẫu

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

Đầu ra

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