เอกสารประกอบสำหรับโมดูล Re สำหรับ Python 3 ใน. โมดูล Re สำหรับนิพจน์ทั่วไป

นิพจน์ทั่วไปเป็นองค์ประกอบที่นิยมอย่างมากในเกือบทุกภาษาการเขียนโปรแกรม ช่วยให้คุณเข้าถึงข้อมูลที่ต้องการได้อย่างรวดเร็ว โดยเฉพาะอย่างยิ่ง จะใช้เมื่อจำเป็นต้องประมวลผลข้อความ Python มาพร้อมกับโมดูลพิเศษโดยค่าเริ่มต้น reซึ่งมีหน้าที่ในการทำงานกับนิพจน์ทั่วไป

วันนี้เราจะมาพูดถึงรายละเอียดโดยทั่วไปว่าเป็นอย่างไร ทำงานกับพวกเขาอย่างไร และโมดูลอย่างไร re จะช่วย.

นิพจน์ทั่วไป: บทนำ

การใช้นิพจน์ทั่วไปคืออะไร? เกือบทั้งหมด. ตัวอย่างเช่น:

  1. เว็บแอปพลิเคชันที่ต้องการการตรวจสอบข้อความ ตัวอย่างทั่วไปคือโปรแกรมรับส่งเมลออนไลน์
  2. โครงการอื่นๆ ที่เกี่ยวข้องกับข้อความ ฐานข้อมูล และอื่นๆ

ก่อนที่เราจะเริ่มแยกวิเคราะห์ไวยากรณ์ เราควรเข้าใจรายละเอียดเพิ่มเติมเกี่ยวกับหลักการพื้นฐานของการทำงานของไลบรารี re และโดยทั่วไปแล้ว สิ่งที่โดยทั่วไปดีเกี่ยวกับเรื่องนี้ เราจะยกตัวอย่างจากการปฏิบัติจริงซึ่งเราจะอธิบายกลไกการใช้งาน คุณสามารถสร้างเทมเพลตดังกล่าวได้ ซึ่งเหมาะสำหรับคุณในการดำเนินการต่างๆ ด้วยข้อความ

เทมเพลตในไลบรารี Re คืออะไร

ด้วยฟังก์ชันนี้ คุณสามารถค้นหาข้อมูลประเภทต่างๆ รับข้อมูลที่เกี่ยวข้อง เพื่อทำให้ฟังก์ชันอื่นๆ ปรับตัวได้มากขึ้น และแน่นอน การประมวลผลข้อมูลนี้

ตัวอย่างเช่น ใช้เทมเพลตต่อไปนี้: s+. มันหมายถึงอักขระช่องว่างใด ๆ หากคุณเพิ่มเครื่องหมายบวกเข้าไป แสดงว่ารูปแบบนั้นมีช่องว่างมากกว่าหนึ่งช่อง สามารถจับคู่อักขระแท็บที่เรียกว่า with . ได้ t+.

ก่อนใช้งาน คุณต้องนำเข้าไลบรารี่ก่อน Re. หลังจากนั้น เราใช้คำสั่งพิเศษในการคอมไพล์เทมเพลต ทำได้ในสองขั้นตอน

>>>นำเข้าอีกครั้ง

>>> regex = re.compile('s+')

โดยเฉพาะอย่างยิ่ง รหัสนี้ดำเนินการรวบรวมเทมเพลตที่สามารถใช้ได้ ตัวอย่างเช่น เพื่อค้นหาช่องว่าง (หนึ่งหรือมากกว่า)

รับข้อมูลแยกจากสตริงต่างๆ โดยใช้นิพจน์ทั่วไป

สมมติว่าเรามีตัวแปรที่มีข้อมูลต่อไปนี้

>>> text = “””100 INF Informatics

213 MAT คณิตศาสตร์  

156 ENG ภาษาอังกฤษ»»»

ประกอบด้วยหลักสูตรการฝึกอบรมสามหลักสูตร แต่ละส่วนประกอบด้วยสามส่วน - หมายเลข รหัส และชื่อ เราจะเห็นว่าช่วงเวลาระหว่างคำเหล่านี้แตกต่างกัน จะทำอย่างไรเพื่อแบ่งบรรทัดนี้เป็นตัวเลขและคำแยกกัน มีสองวิธีในการบรรลุเป้าหมายนี้:

  1. เรียกฟังก์ชัน แยกใหม่.
  2. ใช้ฟังก์ชัน แยก 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()  

"

จากนั้นจะพบเฉพาะแท็กเปิดเท่านั้น

เทมเพลตนิพจน์ยอดนิยม

นี่คือตารางที่มีรูปแบบนิพจน์ทั่วไปที่ใช้บ่อยที่สุด

เอกสารประกอบสำหรับโมดูล Re สำหรับ Python 3 ใน. โมดูล Re สำหรับนิพจน์ทั่วไป

สรุป

เราได้พิจารณาเฉพาะวิธีการพื้นฐานที่สุดสำหรับการทำงานกับนิพจน์ทั่วไปเท่านั้น ไม่ว่าในกรณีใด คุณได้เห็นแล้วว่าพวกมันสำคัญแค่ไหน และที่นี่ก็ไม่ต่างกันเลย ไม่ว่าจำเป็นต้องแยกวิเคราะห์ข้อความทั้งหมดหรือแยกส่วน ไม่ว่าจำเป็นต้องวิเคราะห์โพสต์บนโซเชียลเน็ตเวิร์กหรือรวบรวมข้อมูลเพื่อดำเนินการในภายหลัง นิพจน์ทั่วไปเป็นตัวช่วยที่เชื่อถือได้ในเรื่องนี้

ช่วยให้คุณทำงานต่างๆ เช่น:

  1. การระบุรูปแบบของข้อมูล เช่น ที่อยู่อีเมลหรือหมายเลขโทรศัพท์
  2. รับสตริงและแยกเป็นสตริงที่เล็กกว่าหลายสตริง
  3. ดำเนินการต่างๆ ด้วยข้อความ เช่น ค้นหา ดึงข้อมูลที่จำเป็น หรือการแทนที่อักขระบางส่วน

นิพจน์ทั่วไปยังอนุญาตให้คุณดำเนินการที่ไม่สำคัญได้อีกด้วย เมื่อมองแวบแรก การเรียนรู้วิทยาศาสตร์นี้ไม่ใช่เรื่องง่าย แต่ในทางปฏิบัติ ทุกอย่างเป็นมาตรฐาน ดังนั้นก็เพียงพอที่จะคิดออก หลังจากนั้นเครื่องมือนี้สามารถใช้ได้ไม่เฉพาะใน Python เท่านั้น แต่ยังใช้ในภาษาการเขียนโปรแกรมอื่นๆ ด้วย แม้แต่ Excel ก็ยังใช้นิพจน์ทั่วไปในการประมวลผลข้อมูลโดยอัตโนมัติ ดังนั้นจึงเป็นบาปที่จะไม่ใช้เครื่องมือนี้

เขียนความเห็น