หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
โมดูลสตริงและเวลา
โมดูล Regex
วัตถุประสงค์
ตรวจสอบและจัดระเบียบไฟล์ที่เกี่ยวข้องกับพนักงานและการแบ่งโซนโดยใช้ regular expressions
ในสำนักงานข้างๆ มีเอกสารบางอย่างที่ต้องอัปเดตเกี่ยวกับพนักงานที่เริ่มงานในแปลงเกษตรใหม่และการแบ่งโซนสำหรับพื้นที่ที่ปลูกพืชและเลี้ยงสัตว์ การจัดการไฟล์อาจเป็นเรื่องที่ยุ่งยาก โดยเฉพาะเมื่อทำงานกับข้อความขนาดใหญ่ เพื่อจุดประสงค์นี้ เราจะใช้โมดูล re ซึ่งย่อมาจาก Regular Expressions หรือที่เรียกว่า Regex เราสามารถเข้าถึงฟังก์ชันของมันโดยใช้ import re และสำหรับระดับนี้เราจะใช้ฟังก์ชันดังต่อไปนี้:
re.findall(): คืนค่ารายการของการเกิดขึ้นทั้งหมดของสตริง รับอาร์กิวเมนต์สอง (2) ตัว ตัวแรกคือชุดตัวอักษรที่ต้องการค้นหาในสตริง ส่วนตัวที่สองคือสตริงที่ต้องการค้นหาre.sub(): ใช้แทนที่การเกิดขึ้นของสตริงที่ระบุด้วยสตริงอื่น รับอาร์กิวเมนต์สาม (3) ตัว ตัวแรกคือชุดตัวอักษรที่ต้องการแทนที่ ตัวที่สองคือสตริงที่ต้องการแทนที่ และตัวที่สามคือสตริงที่ต้องการค้นหาre.search(): ค้นหาตำแหน่งของสิ่งที่ต้องการในสตริงและคืนค่าอ็อบเจกต์ รับอาร์กิวเมนต์สอง (2) ตัว คือชุดตัวอักษรที่ต้องการค้นหาและสตริงที่ต้องการค้นหา คุณสามารถใช้ฟังก์ชันอื่น ๆ กับอ็อบเจกต์ที่คืนค่ามา เช่นspan()ซึ่งจะคืนค่าเวกเตอร์ของตำแหน่งเริ่มต้นและสิ้นสุดของรายการที่ค้นหาในข้อความre.split(): แยกสตริงออกเป็นรายการตามช่วงที่กำหนด รับอาร์กิวเมนต์สอง (2) ตัว ตัวแรกคือตัวแบ่งสตริงและตัวที่สองคือสตริงที่ต้องการแยกre.match(): ตรวจสอบว่าสตริงมีค่าที่ระบุอยู่ที่จุดเริ่มต้นของสตริงหรือไม่ ซึ่งทำงานคล้ายกับฟังก์ชันre.search()ในรูปแบบที่เรียบง่ายกว่า แต่มีประสิทธิภาพมากกว่าและตรวจสอบว่าคำค้นหาปรากฏอยู่ที่จุดเริ่มต้นของสตริงหรือไม่
โมดูล re ยังสามารถใช้ลำดับพิเศษได้อีกด้วย ซึ่งมีรหัสที่คุณสามารถใช้กับฟังก์ชัน re เพื่อครอบคลุมคุณสมบัติของสตริงแบบต่าง ๆ มีรายการลำดับพิเศษยาวๆ แต่สำหรับระดับนี้เราจะใช้ดังต่อไปนี้:
\B: ตรวจสอบว่าชุดตัวอักษรที่ระบุอยู่ในสตริงแต่ไม่ได้อยู่ที่จุดเริ่มต้นหรือสิ้นสุดของคำ\D: คืนค่าตัวอักษรที่ไม่ใช่ตัวเลข 0-9
หากมี r อยู่หน้าลำดับพิเศษ หมายความว่ากำลังตรวจสอบสตริงดิบ
เริ่มต้นด้วยการเดินไปยังเครื่องหมาย X สีทองแล้วหันหน้าไปที่โต๊ะที่มีโน้ต ใช้ฟังก์ชัน read() เพื่อตรวจสอบโน้ตซึ่งมีรายชื่อพนักงานทั้งหมด แต่ละชื่อมีเครื่องหมาย # ที่แบ่งหมายเลขพนักงานของพวกเขา สตริงที่มีรายชื่อเหล่านี้ถูกเก็บไว้ในค่าคงที่ที่ชื่อว่า manifest
สร้างรายการที่ชื่อ tags และเก็บค่าที่ได้จาก re.findall() ซึ่งใช้ค้นหาทุกเครื่องหมาย # ในค่าคงที่ manifest ดังนี้: tags = re.findall("#", manifest)
สร้างตัวแปรที่ชื่อ number และใช้ฟังก์ชัน len() กับรายการ tags เพื่อคำนวณจำนวนรายการในรายการ ซึ่งจะบอกให้เราทราบว่ามีพนักงานกี่คนใน manifest
ใช้ฟังก์ชัน speak() พร้อมกับตัวแปร number เพื่อประกาศจำนวนชื่อในรายการ
ต่อไป ให้เดินไปยังเครื่องหมาย X สีอ่อนติดกับพรมสีน้ำเงินแล้วหันไปที่โต๊ะและใช้ฟังก์ชัน read() ที่นี่คุณจะเห็นรายชื่อพนักงานใหม่พร้อมตำแหน่งที่ได้รับมอบหมาย จดบันทึกชื่อในแต่ละอาชีพเพื่อที่คุณจะได้เปรียบเทียบกับคนที่ได้รับมอบหมายอยู่ในปัจจุบัน
เดินไปยังเครื่องหมาย X บนพรมสีน้ำเงินแล้วใช้ read() อีกครั้งเพื่อตรวจสอบงานที่ได้รับมอบหมายในปัจจุบัน
พนักงานปัจจุบันถูกเก็บไว้ในค่าคงที่ที่ชื่อว่า assignments เราต้องปรับปรุงเอกสารนี้ด้วยข้อมูลจากรายชื่อพนักงานใหม่
แทนที่ชื่อที่แตกต่างในรายชื่อโดยใช้ฟังก์ชัน re.sub() เพื่อแทนที่ส่วนหนึ่งของสตริงด้วยอีกสตริงหนึ่ง ตัวอย่างเช่น หนึ่งในการแก้ไขคือดังนี้:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
ชื่อ "Billy Hodgins" ถูกแทนที่ด้วย "Carol Hopkins" ในเอกสาร นอกเหนือจากการเปลี่ยนแปลงนี้ ให้สแกนเอกสารและปรับปรุงชื่ออีกชื่อหนึ่งในรายการเพื่อให้เอกสารได้รับการอัปเดตอย่างครบถ้วน
ใช้ฟังก์ชัน write() พร้อมกับ assignments เพื่อตรวจสอบผลลัพธ์
เมื่อเราได้ดูแลรายชื่อพนักงานเรียบร้อยแล้ว ถึงเวลาที่จะย้ายไปยังการแบ่งโซนของฟาร์ม
เดินไปยังเครื่องหมาย X สีเข้มบนพรมสีแดงแล้วใช้ฟังก์ชัน read() ซึ่งจะแสดงรายละเอียดเกี่ยวกับการแบ่งโซน ข้อมูลนี้ถูกเก็บไว้ในค่าคงที่ที่ชื่อว่า zones
ข้อสังเกตพิเศษคือ สำคัญที่จะต้องระบุที่ตั้งของ 6210 ในเอกสาร เพราะโซนนั้นต้องได้รับการประเมินใหม่
เพื่อทำสิ่งนี้ เราจำเป็นต้องใช้ฟังก์ชัน re.search() เพื่อระบุที่ตั้งของหมายเลขโซนนั้นใน zoning
สร้างตัวแปรที่ชื่อ index และเก็บอ็อบเจกต์จากการค้นหาโดยตั้งค่าการค้นหาเป็น r"6210\B" สิ่งที่เกิดขึ้นคือ r มองหาสตริงดิบ, 6210 คือหมายเลขโซนที่เราต้องการค้นหา และ \B คือเกณฑ์ลำดับพิเศษสำหรับการค้นหา การดำเนินการเป็นดังนี้: index = re.search(r"6210\B", zones)
เมื่อ index ถืออ็อบเจกต์การค้นหาแล้ว ถึงเวลาที่จะดึงข้อมูลจากมันโดยใช้ span()
สร้างตัวแปรที่ชื่อ vector และเก็บตำแหน่งของอ็อบเจกต์การค้นหาดังนี้: vector = index.span() เมื่อเตรียมเสร็จแล้ว ใช้ตัวแปร vector กับฟังก์ชัน write() ที่เขียนไว้ล่วงหน้า
ต่อไปเราจะทำงานในการระบุรายการโซน ให้เดินไปยังเครื่องหมาย X สีเข้มบนพรมสีเขียว
สร้างรายการที่ชื่อ sectors และใช้ฟังก์ชัน re.split() เพื่อนำโซนเฉพาะต่างๆ มารวมเป็นรายการ ในฟังก์ชัน split ใช้ลำดับพิเศษ "\D" เพื่อดึงเฉพาะตัวเลขจากตัวแปร zones
ใช้ list comprehension เพื่อลบรายการที่เป็นช่องว่าง โดยใช้ฟังก์ชัน len() เพื่อลบรายการที่มีความยาวน้อยเกินไปที่จะเป็นหมายเลขโซน เช่นนี้:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
ใช้ zones พร้อมกับฟังก์ชัน write() เพื่อบันทึกข้อมูลโซนทั้งหมด
เดินไปยังเครื่องหมาย X สีอ่อนติดกับพรมสีม่วงแล้วหันไปที่ตู้เอกสาร ใช้ฟังก์ชัน read() เพื่อตรวจสอบโซนที่มีความสำคัญใน zoning ของฟาร์ม จดบันทึกโซนเหล่านี้ไว้เนื่องจากเราจำเป็นต้องตรวจสอบว่าโซนเหล่านี้มีอยู่ในรายการ zoning หรือไม่
เดินไปยังเครื่องหมาย X สีเข้มบนพรมสีม่วง มีโซนที่มีความสำคัญทั้งหมด 3 โซนในตัวแปรที่ชื่อว่า: sector_a, sector_b, sector_c ซึ่งเขียนไว้ล่วงหน้าในตัวแก้ไขโค้ด ให้แทรกค่าที่คุณอ่านได้จากเครื่องหมาย X สีอ่อน
ตัวแปรเหล่านี้ใช้ list comprehension ที่วนผ่านรายการทั้งหมดใน sectors และกรองผ่านฟังก์ชัน re.match()
ใช้ตัวแปร sector_a, sector_b, sector_c และแทรกลงในฟังก์ชัน write() ที่เขียนไว้ล่วงหน้าเพื่อทำให้ระดับนี้เสร็จสมบูรณ์