งูหลามนิพจน์ปกติ
การแสดงออกปกติเป็นลำดับอักขระพิเศษก็สามารถช่วยให้คุณสามารถตรวจสอบว่าสตริงตรงกับรูปแบบ
งูหลามอีกครั้งโมดูลเพิ่มขึ้นตั้งแต่รุ่น 1.5 รูปแบบการแสดงออกปกติที่ให้ Perl สไตล์
Re โมดูลช่วยให้งูหลามภาษามีคุณลักษณะทั้งหมดของการแสดงออกปกติ
รวบรวมฟังก์ชั่นในการสร้างวัตถุแสดงออกปกติจากสตริงรูปแบบและธงพารามิเตอร์ตัวเลือก วัตถุนี้มีกำหนดวิธีการสำหรับการจับคู่แสดงออกปกติและการทดแทน
Re โมดูลนอกจากนี้ยังมีวิธีการที่สอดคล้องกับฟังก์ชั่นเหล่านี้คุณลักษณะที่ใช้รูปแบบสตริงเป็นอาร์กิวเมนต์แรกของพวกเขา
ในส่วนนี้จะแนะนำที่พบงูหลามแสดงออกปกติฟังก์ชั่นการประมวลผล
ฟังก์ชั่น re.match
re.match พยายามที่จะตรงกับรูปแบบจากตำแหน่งเริ่มต้นของสตริงถ้าไม่ตรงกับตำแหน่งเริ่มต้นที่ประสบความสำเร็จคือการแข่งขัน () กลับไม่มี
ไวยากรณ์ฟังก์ชั่น:
re.match(pattern, string, flags=0)
พารามิเตอร์ฟังก์ชัน:
พารามิเตอร์ | ลักษณะ |
---|---|
แบบแผน | ตรงกับการแสดงออกปกติ |
เชือก | สตริงเพื่อให้ตรงกับ |
ธง | ธงจับคู่แสดงออกปกติใช้ในการควบคุมเช่นไม่ว่าจะเป็นกรณี ๆ ไปหลายคู่สายตรงและอื่น ๆ |
วิธีการจับคู่ที่ประสบความสำเร็จจะส่งกลับ re.match วัตถุแข่งขันมิฉะนั้นไม่มี
เราสามารถใช้กลุ่ม (NUM) หรือกลุ่ม () ฟังก์ชันที่จะได้รับวัตถุจับคู่ตรงกับการแสดงออก
ที่ตรงกับวิธีการของวัตถุ | ลักษณะ |
---|---|
กลุ่ม (NUM = 0) | ทั้งการจับคู่สตริงการแสดงออกของกลุ่ม () สามารถป้อนหมายเลขกลุ่มมากกว่าหนึ่งในกรณีที่มันจะกลับมาเป็นค่าที่สอดคล้องกับกลุ่มผู้ tuples |
กลุ่ม () | มันกลับ tuple ทุกกลุ่มของสตริงจาก 1 ถึงจำนวนที่มีอยู่ในกลุ่ม |
ตัวอย่างที่ 1:
#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match('www', 'www.w3big.com').span()) # 在起始位置匹配 print(re.match('com', 'www.w3big.com')) # 不在起始位置匹配
เรียกเอาท์พุทตัวอย่างข้างต้นคือ
(0, 3) None
ตัวอย่างที่ 2:
#!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"
ผลที่ได้จากตัวอย่างข้างต้นมีดังนี้
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter
วิธี re.search
re.search สแกนสตริงทั้งผลตอบแทนและการจับคู่ที่ประสบความสำเร็จเป็นครั้งแรก
ไวยากรณ์ฟังก์ชั่น:
re.search(pattern, string, flags=0)
พารามิเตอร์ฟังก์ชัน:
พารามิเตอร์ | ลักษณะ |
---|---|
แบบแผน | ตรงกับการแสดงออกปกติ |
เชือก | สตริงเพื่อให้ตรงกับ |
ธง | ธงจับคู่แสดงออกปกติใช้ในการควบคุมเช่นไม่ว่าจะเป็นกรณี ๆ ไปหลายคู่สายตรงและอื่น ๆ |
วิธีการจับคู่ที่ประสบความสำเร็จจะส่งกลับ re.search วัตถุแข่งขันมิฉะนั้นไม่มี
เราสามารถใช้กลุ่ม (NUM) หรือกลุ่ม () ฟังก์ชันที่จะได้รับวัตถุจับคู่ตรงกับการแสดงออก
ที่ตรงกับวิธีการของวัตถุ | ลักษณะ |
---|---|
กลุ่ม (NUM = 0) | ทั้งการจับคู่สตริงการแสดงออกของกลุ่ม () สามารถป้อนหมายเลขกลุ่มมากกว่าหนึ่งในกรณีที่มันจะกลับมาเป็นค่าที่สอดคล้องกับกลุ่มผู้ tuples |
กลุ่ม () | มันกลับ tuple ทุกกลุ่มของสตริงจาก 1 ถึงจำนวนที่มีอยู่ในกลุ่ม |
ตัวอย่างที่ 1:
#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search('www', 'www.w3big.com').span()) # 在起始位置匹配 print(re.search('com', 'www.w3big.com').span()) # 不在起始位置匹配
เรียกเอาท์พุทตัวอย่างข้างต้นคือ
(0, 3) (11, 14)
ตัวอย่างที่ 2:
#!/usr/bin/python import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2) else: print "Nothing found!!"ผลที่ได้จากตัวอย่างข้างต้นมีดังนี้
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
ความแตกต่างและ re.match re.search
re.match ตรงเพียงจุดเริ่มต้นของสตริงถ้าเริ่มต้นของสตริงไม่ตรงกับการแสดงออกปกติการแข่งขันล้มเหลวฟังก์ชันจะส่งกลับไม่มีและ re.search ตรงกับสตริงทั้งหมดจนกว่าจะพบการแข่งขัน
ตัวอย่าง:
#!/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print "match --> matchObj.group() : ", matchObj.group() else: print "No match!!" matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print "search --> matchObj.group() : ", matchObj.group() else: print "No match!!"ตัวอย่างของผลลัพธ์ข้างต้นมีดังนี้
No match!! search --> matchObj.group() : dogs
ค้นหาและแทนที่
โมดูลใหม่หลามให้ re.sub สำหรับการแข่งขันสตริงทดแทน
ไวยากรณ์:
re.sub(pattern, repl, string, max=0)
สตริงกลับเป็นสตริงที่มีการแข่งขันทางด้านซ้ายสุด RE จะไม่ซ้ำที่จะมาแทนที่ หากรูปแบบไม่พบตัวละครจะถูกส่งกลับไม่เปลี่ยนแปลง
นับพารามิเตอร์ตัวเลือกเป็นจำนวนครั้งสูงสุดที่รูปแบบการจับคู่ทดแทนนับต้องเป็นจำนวนเต็มไม่เป็นลบ ค่าเริ่มต้นคือ 0 หมายถึงการแทนที่เกิดขึ้นทั้งหมด
ตัวอย่าง:
#!/usr/bin/python import re phone = "2004-959-559 # This is Phone Number" # Delete Python-style comments num = re.sub(r'#.*$', "", phone) print "Phone Num : ", num # Remove anything other than digits num = re.sub(r'\D', "", phone) print "Phone Num : ", numผลที่ได้จากตัวอย่างข้างต้นมีดังนี้
Phone Num : 2004-959-559 Phone Num : 2004959559
ปรับปรุง regex - ธงตัวเลือก
การแสดงออกปกติสามารถมีตัวเลือกธงปรับเปลี่ยนโหมดในการควบคุมการแข่งขัน ปรับปรุงมีการระบุเป็นธงตัวเลือก (|) เมื่อต้องการระบุธงหลายซึ่งสามารถ Bitwise หรือผ่าน ในฐานะที่เป็น re.I | re.M มีการตั้งธง I และ M:
การปรับเปลี่ยน | ลักษณะ |
---|---|
re.I | ดังนั้นการจับคู่ที่ไม่ได้กรณีที่มีความสำคัญ |
re.L | ทำบัตรประจำตัวแปล (รู้จักสถานที่) จับคู่ |
re.M | หลายสายการจับคู่ที่มีผลต่อ ^ และ $ |
re.S | ดังนั้น, การขึ้นบรรทัดใหม่รวมทั้งตรงกับตัวละครทุกตัว |
re.U | ตามที่แก้ไขตัวอักษร Unicode ชุดตัวอักษร ธงนี้มีผลกระทบต่อ \ W \ W \ B, \ บี |
re.X | ธงนี้โดยการให้คุณในรูปแบบที่มีความยืดหยุ่นมากขึ้นเพื่อให้คุณจะเขียนนิพจน์ปกติง่ายต่อการเข้าใจ |
รูปแบบการแสดงออกปกติ
สตริงรูปแบบการใช้ไวยากรณ์พิเศษเพื่อแสดงถึงการแสดงออกปกติ:
ตัวอักษรและตัวเลขตัวเอง รูปแบบการแสดงออกปกติของตัวอักษรและตัวเลขให้ตรงกับสายเดียวกัน
ส่วนใหญ่ของตัวอักษรและตัวเลขจะมีความหมายแตกต่างกันเมื่อนำหน้าด้วยเครื่องหมาย
เครื่องหมายวรรคตอนรอดเฉพาะเมื่อการแข่งขันของตัวเองหรือพวกเขาเป็นตัวแทนของความหมายพิเศษ
ทับขวาตัวเองต้องการที่จะใช้หลบหนีทับขวา
ตั้งแต่การแสดงออกปกติมักจะมีเครื่องหมายดังนั้นคุณควรที่จะใช้สายเดิมจะเป็นตัวแทนของพวกเขา องค์ประกอบ Schema (เช่น R '/ T' เทียบเท่ากับ '// T') ตรงกับตัวอักษรพิเศษที่สอดคล้องกัน
ตารางต่อไปนี้แสดงองค์ประกอบเฉพาะรูปแบบการแสดงออกปกติไวยากรณ์ หากรูปแบบการใช้งานของคุณในขณะที่ให้ธงอาร์กิวเมนต์ตัวเลือกความหมายขององค์ประกอบบางอย่างของรูปแบบจะมีการเปลี่ยนแปลง
โหมด | ลักษณะ |
---|---|
^ | ตรงกับจุดเริ่มต้นของสตริง |
$ | ตรงกับจุดสิ้นสุดของสตริง |
. | ตรงกับตัวอักษรใด ๆ ยกเว้นการขึ้นบรรทัดใหม่เมื่อธง re.DOTALL มีการระบุคุณสามารถจับคู่ตัวอักษรใด ๆ รวมถึงการขึ้นบรรทัดใหม่ |
[ ... ] | มันใช้แทนกลุ่มของตัวอักษรแสดงรายการแยกต่างหาก: [AMK] จับคู่ 'A' 'M' หรือ 'K' |
[^ ... ] | ไม่ [] ตัวอักษร: [^ abc] ตรงนอกเหนือไปจาก A, B, ตัวอักษรค |
อีกครั้ง * | 0 หรือมากกว่าการจับคู่การแสดงออก |
Re + | หนึ่งหรือมากกว่าหนึ่งของการแสดงออกที่ตรงกัน |
อีกครั้ง? | การแข่งขัน 0 หรือ 1 โดยการแสดงออกปกติดังกล่าวข้างต้นในการกำหนดส่วนวิธีที่ไม่โลภ |
Re {n} | |
อีกครั้ง {n} | การแข่งขันที่แน่นอนของ n ก่อนการแสดงออก |
Re {n, m} | Match n ครั้งเมตรโดยการแสดงออกปกติดังกล่าวข้างต้นในการกำหนดส่วนวิธีโลภ |
a | b | การแข่งขันหรือ B |
(อีกครั้ง) | G แสดงออกแข่งขันภายในวงเล็บยังเป็นตัวแทนของกลุ่ม |
(? Imx) | แสดงออกปกติประกอบด้วยสามตัวเลือกธง: I, M, หรือ X มันมีผลกระทบเฉพาะพื้นที่ในวงเล็บ |
(? -imx) | การแสดงออกปกติปิดฉัน, M, หรือ X ธงตัวเลือก มันมีผลกระทบเฉพาะพื้นที่ในวงเล็บ |
(: Re) | ที่คล้ายกัน ( ... ) แต่ไม่ได้เป็นตัวแทนกลุ่ม |
(Imx :? Re) | ผมใช้ในวงเล็บ, M, หรือ X ธงตัวเลือก |
(-imx :? Re) | อย่าใช้ i, M ในวงเล็บหรือ X ธงตัวเลือก |
(? # ... ) | หมายเหตุ |
(? = Re) | แน่ใจว่าข้างหน้าคั่น หากการแสดงออกปกติมีตัวแทนจากที่นี่ ... ประสบความสำเร็จตรงกับที่ตั้งปัจจุบันและล้มเหลวอย่างอื่น แต่เมื่อการแสดงออกที่มีอยู่ได้รับการทดลองเครื่องยนต์จับคู่ไม่ได้ล่วงหน้าที่เหลือของรูปแบบที่เป็นได้พยายามที่คั่นขวา |
(?! Re) | คั่นปฏิเสธไปข้างหน้า และคั่นขัดแน่นอน; ประสบความสำเร็จเมื่อการแสดงออกที่มีอยู่ไม่ตรงกับตำแหน่งปัจจุบันในสตริง |
(?> Re) | จับคู่รูปแบบอิสระ, การขจัดย้อนรอย |
\ W | และตัวเลขการแข่งขันและขีด |
\ W | ตรงกับที่ไม่ใช่ตัวเลขและขีด |
\ S | ตรงกับตัวอักษรช่องว่างใด ๆ เทียบเท่ากับ [\ t \ n \ r \ F] |
\ S | ตรงกับตัวอักษรที่ไม่ว่างเปล่า |
\ D | ตรงกับหมายเลขใด ๆ ที่เทียบเท่ากับ [0-9] |
\ D | ตรงกับที่ไม่ใช่ตัวเลข |
\ a | ตรงกับจุดเริ่มต้นของสตริง |
\ Z | การแข่งขันสิ้นสุดสตริงถ้ามีการขึ้นบรรทัดใหม่เพียงแค่ก่อนที่จะสิ้นสุดของสตริงเพื่อให้ตรงกับการขึ้นบรรทัดใหม่ C |
\ Z | สิ้นสุดการแข่งขันสตริง |
\ G | การแข่งขันการแข่งขันเสร็จสิ้นตำแหน่งสุดท้าย |
\ B | ตรงกับขอบเขตของคำที่เป็นมันหมายถึงสถานที่และช่องว่างระหว่างคำ ยกตัวอย่างเช่น 'เอ้อ \ B' สามารถจับคู่ "ไม่เคย" ใน 'เอ้อ' แต่ไม่สามารถตรงกับ "คำกริยา" ใน 'เอ้อ' |
\ B | ตรงกับเขตแดนไม่ใช่คำ 'เอ้อ \ B' สามารถตรงกับ "คำกริยา" ใน 'เอ้อ' แต่ไม่สามารถจับคู่ "ไม่เคย" ใน 'เอ้อ' |
\ n \ T และไม่ชอบ | ตรงกับขึ้นบรรทัดใหม่ ตรงกับอักขระแท็บ รอ |
\ 1 ... \ 9 | การจับคู่ย่อยแสดงออกแพ็คเก็ต N-TH |
\ 10 | ตรงกับแพ็คเก็ต n แรก subexpression ถ้ามันเป็นหลังจากที่การแข่งขัน มิฉะนั้นการแสดงออกหมายถึงรหัสอักขระฐานแปด |
ตัวอย่างของการแสดงออกปกติ
ตรงกับตัวอักษร
ตัวอย่าง | ลักษณะ |
---|---|
หลาม | ตรงกับ "งูใหญ่" |
ชั้นเรียนตัวอักษร
ตัวอย่าง | ลักษณะ |
---|---|
[Pp] ython | จับคู่ "งูใหญ่" หรือ "งูใหญ่" |
ถู [เจ้า] | การแข่งขัน "ทับทิม" หรือ "คนบ้านนอก" |
[Aeiou] | คนใดคนหนึ่งของตัวอักษรในวงเล็บที่ตรงกัน |
[0-9] | ตรงกับหลักใด ๆ คล้ายกับ [0123456789] |
[Az] | ตรงกับอักษรตัวพิมพ์เล็ก ๆ |
[AZ] | ตรงกับตัวพิมพ์ใหญ่ใด ๆ |
[a-zA-Z0-9] | ตรงกับตัวอักษรและตัวเลขใด ๆ |
[^ Aeiou] | นอกเหนือไปจากตัวละครทุกตัวอื่นที่ไม่ใช่ตัวอักษร Aeiou |
[^ 0-9] | จับคู่ตัวละครยกเว้นตัวเลข |
ชั้นเรียนตัวอักษรพิเศษ
ตัวอย่าง | ลักษณะ |
---|---|
. | ตรงกับตัวอักษรตัวเดียวใด ๆ ยกเว้น "\ n" คือ รวมทั้งเพื่อให้ตรงกับ '\ n' รวมทั้งตัวอักษรใด ๆ เช่นการใช้งานของ '[. \ n] โหมด |
\ D | ตรงกับตัวละครหลัก เทียบเท่ากับ [0-9] |
\ D | ตรงกับตัวละครที่ไม่ใช่ตัวเลข มันจะเทียบเท่ากับ [^ 0-9] |
\ S | ตรงกับตัวอักษรใดช่องว่างรวมถึงช่องว่างแท็บแบ่งหน้าและอื่น ๆ เทียบเท่ากับ [\ F \ n \ r \ t \ V] |
\ S | ตรงกับตัวละครที่ไม่ใช่ช่องว่าง เทียบเท่ากับ [^ \ F \ n \ r \ t \ V] |
\ W | ตรงกับตัวอักษรคำใด ๆ รวมทั้งขีด มันจะเทียบเท่ากับ '[a-ZA-z0-9_] |
\ W | ตรงกับตัวละครที่ไม่ใช่คำใด ๆ มันจะเทียบเท่ากับ '[^ A-ZA-z0-9_] |