Coding for KidsCoding for Kids
ระดับสร้างสรรค์ความท้าทายคู่มือครู
โหวตสำหรับฟีเจอร์
หลักสูตรการพัฒนาด้วย 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() ที่เขียนไว้ล่วงหน้าเพื่อทำให้ระดับนี้เสร็จสมบูรณ์

หนังสือโค้ด