Latest web development tutorials

งูหลามนิพจน์ปกติ

การแสดงออกปกติเป็นลำดับอักขระพิเศษก็สามารถช่วยให้คุณสามารถตรวจสอบว่าสตริงตรงกับรูปแบบ

งูหลามอีกครั้งโมดูลเพิ่มขึ้นตั้งแต่รุ่น 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_]