ที่นี่เราจะมาดูกันว่าเราจะได้รับเทคนิคการจับคู่รูปแบบเชลล์สไตล์ 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'> $