re --- นิพจน์ทั่วไปแบบง่าย¶
โมดูลนี้ใช้งานการดำเนินการนิพจน์ทั่วไป ไวยากรณ์นิพจน์ทั่วไปที่รองรับเป็นส่วนหนึ่งของโมดูล re ของ CPython (และจริงๆ แล้วเป็นส่วนหนึ่งของนิพจน์ทั่วไปแบบขยาย POSIX)
ตัวดำเนินการและลำดับพิเศษที่รองรับมีดังนี้:
.จับคู่อักขระใดก็ได้
[...]จับคู่ชุดของอักขระ รองรับอักขระแต่ละตัวและช่วง รวมถึงชุดที่ถูกปฏิเสธ (เช่น
[^a-c])^จับคู่จุดเริ่มต้นของสตริง
$จับคู่จุดสิ้นสุดของสตริง
?จับคู่รูปแบบย่อยก่อนหน้าศูนย์หรือหนึ่งครั้ง
*จับคู่รูปแบบย่อยก่อนหน้าศูนย์หรือมากกว่าครั้ง
+จับคู่รูปแบบย่อยก่อนหน้าหนึ่งครั้งหรือมากกว่า
??เวอร์ชันที่ไม่โลภของ
?จับคู่ศูนย์หรือหนึ่งครั้ง โดยต้องการผลลัพธ์ศูนย์ก่อน*?เวอร์ชันที่ไม่โลภของ
*จับคู่ศูนย์หรือมากกว่าครั้ง โดยต้องการผลลัพธ์ที่สั้นที่สุด+?เวอร์ชันที่ไม่โลภของ
+จับคู่หนึ่งหรือมากกว่าครั้ง โดยต้องการผลลัพธ์ที่สั้นที่สุด|จับคู่รูปแบบย่อยทางซ้ายมือหรือทางขวามือของตัวดำเนินการนี้
(...)การจัดกลุ่ม แต่ละกลุ่มจะถูกบันทึก (สตริงย่อยที่จับได้สามารถเข้าถึงได้ด้วยเมธอด
match.group())(?:...)การจัดกลุ่มแบบไม่บันทึก แต่ละกลุ่มจะจับคู่โดยใช้กฎเดียวกับการจัดกลุ่มปกติ แต่จะไม่เป็นส่วนหนึ่งของออบเจ็กต์ผลการจับคู่
\dจับคู่ตัวเลข เทียบเท่ากับ
[0-9]\Dจับคู่อักขระที่ไม่ใช่ตัวเลข เทียบเท่ากับ
[^0-9]\sจับคู่ช่องว่าง เทียบเท่ากับ
[ \t-\r]\Sจับคู่อักขระที่ไม่ใช่ช่องว่าง เทียบเท่ากับ
[^ \t-\r]\wจับคู่ "อักขระคำ" (ASCII เท่านั้น) เทียบเท่ากับ
[A-Za-z0-9_]\Wจับคู่อักขระที่ไม่ใช่ "อักขระคำ" (ASCII เท่านั้น) เทียบเท่ากับ
[^A-Za-z0-9_]\อักขระหลีก อักขระอื่นๆ ที่ตามหลังแบ็กสแลช ยกเว้นอักขระที่ระบุไว้ข้างต้น จะถูกตีความตามตัวอักษร ตัวอย่างเช่น
\*เทียบเท่ากับ*ตามตัวอักษร (ไม่ถือเป็นตัวดำเนินการ*) โปรดทราบว่า\r,\nฯลฯ ไม่ได้รับการจัดการเป็นพิเศษ และจะเทียบเท่ากับตัวอักษรr,nฯลฯ ด้วยเหตุนี้ จึงไม่แนะนำให้ใช้สตริง Python แบบ raw (r"") สำหรับนิพจน์ทั่วไป ตัวอย่างเช่นr"\r\n"เมื่อใช้เป็นนิพจน์ทั่วไปจะเทียบเท่ากับ"rn"หากต้องการจับคู่อักขระ CR ตามด้วย LF ให้ใช้"\r\n"
ไม่รองรับ:
การทำซ้ำแบบนับจำนวน (
{m,n})กลุ่มที่มีชื่อ (
(?P<name>...))การยืนยันขั้นสูงเพิ่มเติม (
\b,\B)การหลีกอักขระพิเศษ เช่น
\r,\n- ใช้การหลีกของ Python เองแทนฯลฯ
ตัวอย่าง:
import re
# As re doesn't support escapes itself, use of r"" strings is not
# recommended.
regex = re.compile("[\r\n]")
regex.split("line1\rline2\nline3\r\n")
# Result:
# ['line1', 'line2', 'line3', '', '']
ฟังก์ชัน¶
- re.search(regex_str: str, string: str) 'match | None'¶
คอมไพล์ regex_str และค้นหาใน string ต่างจาก
matchตรงที่จะค้นหาในสตริงจากตำแหน่งแรกที่ตรงกับนิพจน์ทั่วไป (ซึ่งอาจเป็น 0 ก็ได้หากนิพจน์ทั่วไปมีการยึด)
- re.sub(regex_str: str, replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str¶
คอมไพล์ regex_str และค้นหาใน string โดยแทนที่การจับคู่ทั้งหมดด้วย replace แล้วคืนค่าสตริงใหม่
replace อาจเป็นสตริงหรือฟังก์ชัน หากเป็นสตริง สามารถใช้ลำดับหลีกในรูปแบบ
\<number>และ\g<number>เพื่อขยายเป็นกลุ่มที่สอดคล้องกัน (หรือสตริงว่างสำหรับกลุ่มที่ไม่ตรง) หาก replace เป็นฟังก์ชัน จะต้องรับอาร์กิวเมนต์เดี่ยว (ผลการจับคู่) และควรคืนค่าสตริงแทนที่หาก count ถูกระบุและไม่เป็นศูนย์ การแทนที่จะหยุดลงหลังจากทำการแทนที่ครบตามจำนวน อาร์กิวเมนต์ flags จะถูกละเว้น
ออบเจ็กต์ Regex¶
นิพจน์ทั่วไปที่คอมไพล์แล้ว อินสแตนซ์ของคลาสนี้สร้างโดยใช้ re.compile()
- class re.regex
ออบเจ็กต์นิพจน์ทั่วไปที่คอมไพล์แล้ว ซึ่งคืนค่าโดย
re.compile()- match(string: str, pos: int = 0, endpos: int | None = None) 'match | None'¶
นำนิพจน์ทั่วไปที่คอมไพล์แล้วนี้ไปใช้กับ string โดยยึดที่จุดเริ่มต้นของบริเวณค้นหา และคืนค่าออบเจ็กต์
matchหรือNoneหากนิพจน์ทั่วไปไม่ตรง นี่คือตัวเทียบเท่าของรูปแบบที่คอมไพล์แล้วสำหรับmatchระดับโมดูล และมีประสิทธิภาพสูงกว่ามากเมื่อใช้รูปแบบเดียวกันกับหลายสตริงพารามิเตอร์ตัวเลือก pos ระบุดัชนีใน string ที่จะเริ่มค้นหา ค่าเริ่มต้นคือ
0ซึ่งไม่เทียบเท่ากับการตัดสตริงทั้งหมด อักขระรูปแบบ'^'จะจับคู่ที่จุดเริ่มต้นจริงของสตริงและที่ตำแหน่งหลังจากการขึ้นบรรทัดใหม่ทันที แต่ไม่จำเป็นต้องอยู่ที่ดัชนีที่จะเริ่มค้นหาพารามิเตอร์ตัวเลือก endpos จำกัดระยะทางที่จะค้นหา string ราวกับว่าสตริงมีความยาว endpos อักขระ ดังนั้นจะค้นหาเฉพาะอักขระตั้งแต่ pos ถึง
endpos - 1เท่านั้น หาก endpos เป็นNone(ค่าเริ่มต้น) จะค้นหาสตริงทั้งหมด
- search(string: str, pos: int = 0, endpos: int | None = None) 'match | None'¶
สแกนผ่าน string เพื่อหาตำแหน่งแรกที่นิพจน์ทั่วไปที่คอมไพล์แล้วนี้ให้ผลการจับคู่ และคืนค่าออบเจ็กต์
matchหรือNoneหากไม่มีตำแหน่งที่ตรง นี่คือตัวเทียบเท่าของรูปแบบที่คอมไพล์แล้วสำหรับฟังก์ชันsearch()ระดับโมดูล และมีประสิทธิภาพสูงกว่ามากเมื่อใช้รูปแบบเดียวกันกับหลายสตริงพารามิเตอร์ตัวเลือก pos ระบุดัชนีใน string ที่จะเริ่มค้นหา ค่าเริ่มต้นคือ
0ซึ่งไม่เทียบเท่ากับการตัดสตริงทั้งหมด อักขระรูปแบบ'^'จะจับคู่ที่จุดเริ่มต้นจริงของสตริงและที่ตำแหน่งหลังจากการขึ้นบรรทัดใหม่ทันที แต่ไม่จำเป็นต้องอยู่ที่ดัชนีที่จะเริ่มค้นหาพารามิเตอร์ตัวเลือก endpos จำกัดระยะทางที่จะค้นหา string ราวกับว่าสตริงมีความยาว endpos อักขระ ดังนั้นจะค้นหาเฉพาะอักขระตั้งแต่ pos ถึง
endpos - 1เท่านั้น หาก endpos เป็นNone(ค่าเริ่มต้น) จะค้นหาสตริงทั้งหมด
- sub(replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str¶
ค้นหานิพจน์ทั่วไปที่คอมไพล์แล้วนี้ใน string โดยแทนที่การจับคู่ทั้งหมดด้วย replace และคืนค่าสตริงใหม่ นี่คือตัวเทียบเท่าของรูปแบบที่คอมไพล์แล้วสำหรับฟังก์ชัน
sub()ระดับโมดูล และมีประสิทธิภาพสูงกว่ามากเมื่อใช้รูปแบบเดียวกันกับหลายสตริงreplace อาจเป็นสตริงหรือฟังก์ชัน หากเป็นสตริง สามารถใช้ลำดับหลีกในรูปแบบ
\<number>และ\g<number>เพื่อขยายเป็นกลุ่มที่สอดคล้องกัน (หรือสตริงว่างสำหรับกลุ่มที่ไม่ตรง) หาก replace เป็นฟังก์ชัน จะต้องรับอาร์กิวเมนต์เดี่ยว (ผลการจับคู่) และควรคืนค่าสตริงแทนที่หาก count ถูกระบุและไม่เป็นศูนย์ การแทนที่จะหยุดลงหลังจากทำการแทนที่ครบตามจำนวน อาร์กิวเมนต์ flags จะถูกละเว้น
ออบเจ็กต์ผลการจับคู่¶
ออบเจ็กต์ผลการจับคู่เก็บผลลัพธ์ของการจับคู่ที่สำเร็จ
- class re.match(regex_str: str, string: str)¶
จับคู่ regex_str กับ string โดยยึดที่จุดเริ่มต้นของสตริง และคืนค่าออบเจ็กต์ผลการจับคู่ หรือ
Noneหากไม่ตรง นี่คือทางลัดระดับโมดูล:re.match(regex_str, string)เทียบเท่ากับre.compile(regex_str).match(string)ออบเจ็กต์ผลการจับคู่เดียวกันนี้ยังถูกคืนค่าโดย
search()โดยเมธอดregex.match()/regex.search()ของรูปแบบที่คอมไพล์แล้ว และถูกส่งผ่านไปยังฟังก์ชันแทนที่ที่ใช้โดยsub()