Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การจับคู่รูปแบบชื่อไฟล์ Unix ใน Python


ที่นี่เราจะมาดูกันว่าเราจะได้รับเทคนิคการจับคู่รูปแบบเชลล์สไตล์ UNIX โดยใช้ Python ได้อย่างไร มีโมดูลที่เรียกว่า fnmatch ที่ใช้ในการทำงาน โมดูลนี้ใช้เพื่อเปรียบเทียบชื่อไฟล์กับรูปแบบ จากนั้นคืนค่า True หรือ False ตามการจับคู่

หากต้องการใช้งานในตอนแรก เราต้องนำเข้า fnmatch โมดูลห้องสมุดมาตรฐาน

import fnmatch

ในเทอร์มินัล Unix มีไวด์การ์ดบางตัวที่ตรงกับรูปแบบ เหล่านี้เป็นเหมือนด้านล่าง −

  • ‘*’ เครื่องหมายดอกจันใช้เพื่อจับคู่ทุกอย่าง
  • ‘?’ เครื่องหมายคำถามใช้สำหรับจับคู่อักขระตัวเดียว
  • [seq] ใช้ลำดับเพื่อจับคู่อักขระตามลำดับ
  • [!seq] Not in Sequence ใช้เพื่อจับคู่อักขระที่ไม่มีอยู่ในลำดับ

หากเราต้องการค้นหาเครื่องหมายดอกจันหรือเครื่องหมายคำถามเป็นอักขระ เราก็ต้องใช้ [*] หรือ [?]

เมธอด fnmatch()

เมธอด fnmatch() รับ 2 อาร์กิวเมนต์ ได้แก่ ชื่อไฟล์และรูปแบบ ฟังก์ชันนี้ใช้เพื่อตรวจสอบว่าชื่อไฟล์ตรงกับรูปแบบที่กำหนดหรือไม่ เมื่อระบบปฏิบัติการคำนึงถึงขนาดตัวพิมพ์ พารามิเตอร์จะถูกทำให้เป็นอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก่อนที่จะจับคู่

โค้ดตัวอย่าง

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() วิธีการยังใช้สองพารามิเตอร์ อันแรกเป็นชื่อ อันที่สองคือแบบแผน รูปแบบนี้จะค้นหารายชื่อไฟล์ที่ตรงกันจากรายการชื่อไฟล์ทั้งหมด

โค้ดตัวอย่าง

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() ใช้พารามิเตอร์เดียว พารามิเตอร์เป็นรูปแบบ เราสามารถใช้ฟังก์ชันนี้เพื่อแปลงรูปแบบรูปแบบเชลล์เป็นรูปแบบอื่นเพื่อให้จับคู่โดยใช้นิพจน์ทั่วไปใน 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'>
$