เนื้อหา
นิพจน์ทั่วไปเป็นองค์ประกอบที่นิยมอย่างมากในเกือบทุกภาษาการเขียนโปรแกรม ช่วยให้คุณเข้าถึงข้อมูลที่ต้องการได้อย่างรวดเร็ว โดยเฉพาะอย่างยิ่ง จะใช้เมื่อจำเป็นต้องประมวลผลข้อความ Python มาพร้อมกับโมดูลพิเศษโดยค่าเริ่มต้น reซึ่งมีหน้าที่ในการทำงานกับนิพจน์ทั่วไป
วันนี้เราจะมาพูดถึงรายละเอียดโดยทั่วไปว่าเป็นอย่างไร ทำงานกับพวกเขาอย่างไร และโมดูลอย่างไร re จะช่วย.
นิพจน์ทั่วไป: บทนำ
การใช้นิพจน์ทั่วไปคืออะไร? เกือบทั้งหมด. ตัวอย่างเช่น:
- เว็บแอปพลิเคชันที่ต้องการการตรวจสอบข้อความ ตัวอย่างทั่วไปคือโปรแกรมรับส่งเมลออนไลน์
- โครงการอื่นๆ ที่เกี่ยวข้องกับข้อความ ฐานข้อมูล และอื่นๆ
ก่อนที่เราจะเริ่มแยกวิเคราะห์ไวยากรณ์ เราควรเข้าใจรายละเอียดเพิ่มเติมเกี่ยวกับหลักการพื้นฐานของการทำงานของไลบรารี re และโดยทั่วไปแล้ว สิ่งที่โดยทั่วไปดีเกี่ยวกับเรื่องนี้ เราจะยกตัวอย่างจากการปฏิบัติจริงซึ่งเราจะอธิบายกลไกการใช้งาน คุณสามารถสร้างเทมเพลตดังกล่าวได้ ซึ่งเหมาะสำหรับคุณในการดำเนินการต่างๆ ด้วยข้อความ
เทมเพลตในไลบรารี Re คืออะไร
ด้วยฟังก์ชันนี้ คุณสามารถค้นหาข้อมูลประเภทต่างๆ รับข้อมูลที่เกี่ยวข้อง เพื่อทำให้ฟังก์ชันอื่นๆ ปรับตัวได้มากขึ้น และแน่นอน การประมวลผลข้อมูลนี้
ตัวอย่างเช่น ใช้เทมเพลตต่อไปนี้: s+. มันหมายถึงอักขระช่องว่างใด ๆ หากคุณเพิ่มเครื่องหมายบวกเข้าไป แสดงว่ารูปแบบนั้นมีช่องว่างมากกว่าหนึ่งช่อง สามารถจับคู่อักขระแท็บที่เรียกว่า with . ได้ t+.
ก่อนใช้งาน คุณต้องนำเข้าไลบรารี่ก่อน Re. หลังจากนั้น เราใช้คำสั่งพิเศษในการคอมไพล์เทมเพลต ทำได้ในสองขั้นตอน
>>>นำเข้าอีกครั้ง
>>> regex = re.compile('s+')
โดยเฉพาะอย่างยิ่ง รหัสนี้ดำเนินการรวบรวมเทมเพลตที่สามารถใช้ได้ ตัวอย่างเช่น เพื่อค้นหาช่องว่าง (หนึ่งหรือมากกว่า)
รับข้อมูลแยกจากสตริงต่างๆ โดยใช้นิพจน์ทั่วไป
สมมติว่าเรามีตัวแปรที่มีข้อมูลต่อไปนี้
>>> text = “””100 INF Informatics
213 MAT คณิตศาสตร์
156 ENG ภาษาอังกฤษ»»»
ประกอบด้วยหลักสูตรการฝึกอบรมสามหลักสูตร แต่ละส่วนประกอบด้วยสามส่วน - หมายเลข รหัส และชื่อ เราจะเห็นว่าช่วงเวลาระหว่างคำเหล่านี้แตกต่างกัน จะทำอย่างไรเพื่อแบ่งบรรทัดนี้เป็นตัวเลขและคำแยกกัน มีสองวิธีในการบรรลุเป้าหมายนี้:
- เรียกฟังก์ชัน แยกใหม่.
- ใช้ฟังก์ชัน แยก for นิพจน์ทั่วไป.
นี่คือตัวอย่างการใช้ไวยากรณ์ของแต่ละวิธีสำหรับตัวแปรของเรา
>>> re.split('s+', ข้อความ)
# หรือ
>>> regex.split (ข้อความ)
เอาท์พุต: ['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'English']
โดยทั่วไปสามารถใช้ได้ทั้งสองวิธี แต่จริงๆ แล้ว มันง่ายกว่ามากที่จะใช้นิพจน์ทั่วไปแทนที่จะใช้ฟังก์ชันหลายๆ ครั้ง แยกใหม่.
ค้นหาคู่ที่ตรงกับสามฟังก์ชั่น
สมมติว่าเราต้องแยกเฉพาะตัวเลขออกจากสตริง ต้องทำอะไรเพื่อสิ่งนี้?
อีกครั้งค้นหา()
นี่คือกรณีการใช้งานสำหรับฟังก์ชัน ค้นหาทั้งหมด ()ซึ่งร่วมกับนิพจน์ทั่วไป ช่วยให้คุณสามารถดึงตัวเลขหนึ่งตัวขึ้นไปจากตัวแปรข้อความได้
>>> พิมพ์ (ข้อความ)
100 INF สารสนเทศ
213 MAT คณิตศาสตร์
156 ENG ภาษาอังกฤษ
>>> regex_num = re.compile('d+')
>>> regex_num.findall(ข้อความ)
['100', '213', '156']
ร่วมกับสัญลักษณ์ d เราใช้เทมเพลตที่ระบุค่าตัวเลขใดๆ ที่อยู่ในตัวแปรหรือข้อความ และเนื่องจากเราเพิ่ม + เข้าไปหนึ่งตัว หมายความว่าต้องมีตัวเลขอย่างน้อยหนึ่งตัว
คุณยังสามารถใช้เครื่องหมาย * เพื่อระบุว่าไม่จำเป็นต้องมีตัวเลขสำหรับการค้นหาที่ตรงกัน
แต่ในกรณีของเรา เนื่องจากเราใช้ + เราจึงแยกด้วย ค้นหาทั้งหมด () การกำหนดหลักสูตรดิจิทัลตั้งแต่ 1 รายการขึ้นไปจากข้อความ ดังนั้น ในกรณีของเรา นิพจน์ทั่วไปจะทำหน้าที่เป็นการตั้งค่าสำหรับฟังก์ชัน
การวิจัย () vs รีแมตช์()
อย่างที่คุณเดาได้จากชื่อฟังก์ชัน อันดับแรกจะค้นหาการจับคู่ในข้อความ คำถาม: อะไรคือความแตกต่างระหว่าง ฟินดอลล์? ประเด็นคือมันส่งคืนวัตถุเฉพาะที่ตรงกับรูปแบบ ไม่ใช่ลำดับทั้งหมดของผลลัพธ์ที่พบในรูปแบบของรายการ เช่นเดียวกับฟังก์ชันก่อนหน้า
ในทางกลับกัน ฟังก์ชัน re.match ก็ทำเช่นเดียวกัน เฉพาะไวยากรณ์เท่านั้นที่แตกต่างกัน ต้องวางแม่แบบไว้ที่จุดเริ่มต้น
ลองมาดูตัวอย่างที่แสดงสิ่งนี้
>>> # สร้างตัวแปรด้วยข้อความ
>>> text2 = «»»INF สารสนเทศ
213 MAT คณิตศาสตร์ 156″»»
>>> # รวบรวม regex แล้วมองหารูปแบบ
>>> regex_num = re.compile('d+')
>>> s = regex_num.search(ข้อความ2)
>>> print('ดัชนีแรก: ', s.start())
>>> พิมพ์ ('ดัชนีสุดท้าย: ', s.end())
>>> พิมพ์ (text2[s.start():s.end()])
ดัชนีแรก: 17
ดัชนีล่าสุด: 20
213
หากคุณต้องการได้ผลลัพธ์ที่คล้ายคลึงกันในวิธีที่ต่างออกไป คุณสามารถใช้ฟังก์ชัน กลุ่ม().
การแทนที่ข้อความบางส่วนด้วย Re library
หากต้องการแทนที่ข้อความ ให้ใช้ฟังก์ชัน re.sub() สมมติว่ารายชื่อหลักสูตรของเรามีการเปลี่ยนแปลงเล็กน้อย เราจะเห็นว่าหลังจากแต่ละค่าดิจิทัลเรามีแท็บ งานของเราคือการรวมลำดับทั้งหมดนี้เป็นบรรทัดเดียว เมื่อต้องการทำเช่นนี้ เราต้องแทนที่นิพจน์ s+ เพื่อผ่าน
ข้อความต้นฉบับคือ:
# สร้างตัวแปรด้วยข้อความ
>>> text = “””100 INF t สารสนเทศ
213 MAT t คณิตศาสตร์
156 ENG ภาษาไทย»»»
>>> พิมพ์ (ข้อความ)
100 ข้อมูล วิทยาการคอมพิวเตอร์
213 มัต คณิตศาสตร์
156 อัง ภาษาอังกฤษ
เพื่อดำเนินการตามที่ต้องการ เราใช้รหัสบรรทัดต่อไปนี้
# แทนที่หนึ่งช่องว่างหรือมากกว่าด้วย1
>>> regex = re.compile('s+')
>>> พิมพ์ (regex.sub(' ', text))
เป็นผลให้เรามีหนึ่งบรรทัด
101 COM คอมพิวเตอร์ 205 MAT คณิตศาสตร์ 189 ENG English
ตอนนี้พิจารณาปัญหาอื่น เราไม่ต้องเผชิญกับงานวางช่องว่าง เป็นสิ่งสำคัญมากสำหรับเราที่ชื่อหลักสูตรทั้งหมดเริ่มต้นในบรรทัดใหม่ เมื่อต้องการทำเช่นนี้ นิพจน์อื่นจะใช้ที่เพิ่มบรรทัดใหม่ให้กับข้อยกเว้น นี่คือการแสดงออกแบบไหน?
ห้องสมุด Re รองรับคุณสมบัติเช่นการจับคู่เชิงลบ ซึ่งแตกต่างจากตรงตรงที่มีเครื่องหมายตกใจก่อนเครื่องหมายทับ นั่นคือถ้าเราต้องข้ามอักขระขึ้นบรรทัดใหม่ เราต้องเขียน !n แทน n
เราได้รับรหัสต่อไปนี้
#ลบช่องว่างทั้งหมดยกเว้นขึ้นบรรทัดใหม่
>>> regex = re.compile('((?!n)s+)')
>>> พิมพ์ (regex.sub(' ', text))
100 INF สารสนเทศ
213 MAT คณิตศาสตร์
156 ENG ภาษาอังกฤษ
กลุ่มนิพจน์ทั่วไปคืออะไร
ด้วยความช่วยเหลือของกลุ่มนิพจน์ทั่วไป เราสามารถรับวัตถุที่ต้องการในรูปแบบขององค์ประกอบที่แยกจากกัน ไม่ใช่ในบรรทัดเดียว
สมมติว่าเราจำเป็นต้องได้รับหมายเลขรหัสและชื่อหลักสูตรไม่ใช่ในบรรทัดเดียว แต่เป็นองค์ประกอบที่แยกจากกัน เพื่อให้งานเสร็จสมบูรณ์ คุณจะต้องเขียนโค้ดที่ไม่จำเป็นจำนวนมาก
อันที่จริง งานนี้สามารถทำให้ง่ายขึ้นอย่างมาก คุณสามารถรวบรวมเทมเพลตสำหรับรายการทั้งหมดและระบุข้อมูลที่คุณต้องการได้รับจากวงเล็บ
จะมีจำนวนบรรทัดน้อยมาก
# สร้างกลุ่มของเทมเพลตข้อความหลักสูตรและแยกออก
>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'
>>> re.findall(course_pattern, text)
[('100', 'INF', 'Computer Science'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]
แนวความคิดของการจับคู่ "โลภ"
ตามมาตรฐาน นิพจน์ทั่วไปได้รับการตั้งโปรแกรมให้ดึงข้อมูลจำนวนสูงสุดที่ตรงกัน และแม้ว่าคุณจะต้องการน้อยกว่ามาก
มาดูตัวอย่างโค้ด HTML ที่เราต้องใช้เพื่อรับแท็ก
>>> text = “ตัวอย่างของ Greedy Regular Expression Matching”
>>> re.findall('', ข้อความ)
['ตัวอย่างการจับคู่นิพจน์ทั่วไปโลภ']
แทนที่จะแยกแท็กเพียงแท็กเดียว Python ได้สตริงทั้งหมด เหตุนั้นจึงเรียกว่าโลภะ
และต้องทำอย่างไรเพื่อให้ได้แท็กเท่านั้น? ในกรณีนี้ คุณต้องใช้การจับคู่แบบสันหลังยาว ในการระบุนิพจน์ดังกล่าว เครื่องหมายคำถามจะถูกเพิ่มที่ส่วนท้ายของรูปแบบ
คุณจะได้รับรหัสต่อไปนี้และผลลัพธ์ของล่าม
>>> re.findall('', ข้อความ)
-
หากจำเป็นต้องได้รับเฉพาะการเกิดขึ้นครั้งแรก ให้ใช้วิธีนี้ ค้นหา ().
re.search('', text).group()
"
จากนั้นจะพบเฉพาะแท็กเปิดเท่านั้น
เทมเพลตนิพจน์ยอดนิยม
นี่คือตารางที่มีรูปแบบนิพจน์ทั่วไปที่ใช้บ่อยที่สุด
สรุป
เราได้พิจารณาเฉพาะวิธีการพื้นฐานที่สุดสำหรับการทำงานกับนิพจน์ทั่วไปเท่านั้น ไม่ว่าในกรณีใด คุณได้เห็นแล้วว่าพวกมันสำคัญแค่ไหน และที่นี่ก็ไม่ต่างกันเลย ไม่ว่าจำเป็นต้องแยกวิเคราะห์ข้อความทั้งหมดหรือแยกส่วน ไม่ว่าจำเป็นต้องวิเคราะห์โพสต์บนโซเชียลเน็ตเวิร์กหรือรวบรวมข้อมูลเพื่อดำเนินการในภายหลัง นิพจน์ทั่วไปเป็นตัวช่วยที่เชื่อถือได้ในเรื่องนี้
ช่วยให้คุณทำงานต่างๆ เช่น:
- การระบุรูปแบบของข้อมูล เช่น ที่อยู่อีเมลหรือหมายเลขโทรศัพท์
- รับสตริงและแยกเป็นสตริงที่เล็กกว่าหลายสตริง
- ดำเนินการต่างๆ ด้วยข้อความ เช่น ค้นหา ดึงข้อมูลที่จำเป็น หรือการแทนที่อักขระบางส่วน
นิพจน์ทั่วไปยังอนุญาตให้คุณดำเนินการที่ไม่สำคัญได้อีกด้วย เมื่อมองแวบแรก การเรียนรู้วิทยาศาสตร์นี้ไม่ใช่เรื่องง่าย แต่ในทางปฏิบัติ ทุกอย่างเป็นมาตรฐาน ดังนั้นก็เพียงพอที่จะคิดออก หลังจากนั้นเครื่องมือนี้สามารถใช้ได้ไม่เฉพาะใน Python เท่านั้น แต่ยังใช้ในภาษาการเขียนโปรแกรมอื่นๆ ด้วย แม้แต่ Excel ก็ยังใช้นิพจน์ทั่วไปในการประมวลผลข้อมูลโดยอัตโนมัติ ดังนั้นจึงเป็นบาปที่จะไม่ใช้เครื่องมือนี้