กลุ่มจับและกลุ่มที่มีชื่อ
วงเล็บสำหรับจับกลุ่ม กลุ่มที่มีชื่อ (?P ...) re.fullmatch() และการมองไปข้างหน้า/ข้างหลัง
กลุ่มจับและกลุ่มที่มีชื่อ เป็นบทเรียน Learn AI with Python ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn AI with Python และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องใช้กลุ่ม
กลุ่มช่วยให้คุณแยกส่วนต่าง ๆ ของการตรงกันออกมา เพื่อดึงเฉพาะส่วนที่ต้องการได้ เช่น รหัสพื้นที่จากหมายเลขโทรศัพท์ ปีจากวันที่ หรือชื่อผู้ใช้จากอีเมล
บทเรียนนี้ครอบคลุมกลุ่มจับข้อความ กลุ่มแบบตั้งชื่อ กลุ่มที่ไม่จับข้อความ และการตรวจสอบรอบข้าง
กลุ่มจับข้อความด้วย ( )
ครอบส่วนหนึ่งของรูปแบบด้วยวงเล็บเพื่อจับส่วนนั้น การตรงกันทั้งหมดรวมถึงแต่ละกลุ่มจะเข้าถึงได้ผ่านออบเจ็กต์ Match
import re
m = re.search("(\d{4})-(\d{2})-(\d{2})", "Date: 2026-05-29")
print(m.group()) # "2026-05-29" (whole match)
print(m.group(1)) # "2026"
print(m.group(2)) # "05"match.group, groups, groupdict
ตัวเข้าถึงที่มีประโยชน์:
m.group(0)— การตรงกันทั้งหมดm.group(n)— กลุ่มที่จับได้ลำดับที่ nm.groups()— ทูเพิลของกลุ่มที่จับได้ทั้งหมด
import re
m = re.search("(\d{4})-(\d{2})-(\d{2})", "2026-05-29")
print(m.groups()) # ("2026", "05", "29")
year, month, day = m.groups()กลุ่มแบบตั้งชื่อด้วย (?P<name>...)
การอ้างกลุ่มด้วยหมายเลขอาจเปราะบาง กลุ่มแบบตั้งชื่อใช้ (?P<name>...) เพื่อให้คุณอ้างอิงกลุ่มที่จับได้ด้วยชื่อที่สื่อความหมาย
import re
m = re.search("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})", "2026-05-29")
print(m.group("year")) # "2026"
print(m.group("month")) # "05"groupdict สำหรับผลลัพธ์แบบมีโครงสร้าง
m.groupdict() จะส่งคืนกลุ่มแบบตั้งชื่อทั้งหมดเป็นพจนานุกรม เหมาะอย่างยิ่งสำหรับเปลี่ยนข้อความที่ตรงกันให้เป็นระเบียนที่มีโครงสร้าง
import re
m = re.search("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})", "2026-05-29")
print(m.groupdict())
# {"year": "2026", "month": "05", "day": "29"}กลุ่มที่ไม่จับข้อความ (?:...)
บางครั้งคุณต้องใช้วงเล็บเพื่อจัดกลุ่มเท่านั้น (เช่น เพื่อใช้ตัวระบุจำนวน) แต่ไม่ต้องการจับข้อความ ให้ใช้ (?:...)
วิธีนี้ช่วยให้ลำดับหมายเลขกลุ่มของคุณเป็นระเบียบ
import re
# Group "ab" so + applies, but do not capture it
m = re.search("(?:ab)+(\d+)", "ababab42")
print(m.group(1)) # "42" -> group 1 is the digits, not "ab"การอ้างอิงย้อนกลับ
การอ้างอิงย้อนกลับ \1 จะตรงกับข้อความเดียวกับที่กลุ่มหนึ่งจับไว้ก่อนหน้านี้ มีประโยชน์สำหรับค้นหาคำที่ซ้ำกัน
import re
# Find a word repeated twice in a row
print(re.findall("(\w+) \1", "the the cat cat sat"))
# ["the", "cat"]การมองไปข้างหน้า (?=...)
การมองไปข้างหน้าแบบเป็นบวก (?=...) ยืนยันว่าต้องมีสิ่งใดตามมา โดยไม่ใช้สิ่งนั้นในการจับคู่ ข้อความที่ยืนยันจะไม่เป็นส่วนหนึ่งของการจับคู่
ในที่นี้ เราจะจับคู่ตัวเลขก็ต่อเมื่อตัวเลขนั้นตามด้วย "px"
import re
print(re.findall("\d+(?=px)", "10px 20em 30px"))
# ["10", "30"] -> "20" skipped (not followed by px)การมองไปข้างหน้าแบบเป็นลบ (?!...)
การมองไปข้างหน้าแบบเป็นลบ (?!...) ยืนยันว่าต้องไม่มีสิ่งใดตามมา จับคู่ตัวเลขก็ต่อเมื่อไม่ได้ตามด้วย "px"
import re
print(re.findall("\d+(?!px)", "10px 20em 30px"))
# matches numbers not followed directly by pxการมองย้อนกลับ (?<=...) และ (?<!...)
การมองย้อนกลับ จะยืนยันว่ามีสิ่งใดอยู่ ก่อนหน้า การจับคู่ โดยไม่ใช้สิ่งนั้นในการจับคู่:
(?<=...)แบบเป็นบวก — ต้องมีสิ่งนี้อยู่ก่อนหน้า(?<!...)แบบเป็นลบ — ต้องไม่มีสิ่งนี้อยู่ก่อนหน้า
ในที่นี้ เราจะดึงจำนวนเงินที่มีเครื่องหมายดอลลาร์อยู่ก่อนหน้า โดยไม่จับเครื่องหมายนั้น
import re
print(re.findall("(?<=\$)\d+", "price $50 and 60 units"))
# ["50"] -> only the amount after $การรวมกลุ่มและการตรวจสอบรอบข้าง
ตัวดึงข้อมูลที่ใช้งานจริงมักผสมเครื่องมือเหล่านี้เข้าด้วยกัน รูปแบบนี้ดึงราคาที่มีชื่อ ซึ่งต้องมีสัญลักษณ์สกุลเงินอยู่ก่อนหน้าและมีส่วนทศนิยมตามหลัง:
import re
text = "Total: $1299.99 paid"
m = re.search("(?<=\$)(?P<amount>\d+)\.(?P<cents>\d{2})", text)
print(m.group("amount"), m.group("cents")) # 1299 99ตรวจสอบอย่างรวดเร็ว: กลุ่มที่มีชื่อ
คุณต้องการดึงรายการที่จับคู่โดยใช้ชื่อที่อ่านเข้าใจง่าย เช่น "year" แทนการใช้ตัวเลข
ทบทวน: กลุ่มและการตรวจสอบรอบข้าง
ขณะนี้คุณสามารถดึงโครงสร้างที่เฉพาะเจาะจงจากข้อความได้แล้ว:
( )กลุ่มที่ใช้จับคู่และดึงข้อมูลด้วยm.group(n)และm.groups()(?P<name>...)กลุ่มที่มีชื่อด้วยm.groupdict()(?:...)กลุ่มที่ไม่ใช้จับคู่ สำหรับจัดกลุ่มอย่างเป็นระเบียบ- การอ้างอิงย้อนกลับ
\1สำหรับข้อความที่ซ้ำกัน - การมองไปข้างหน้า
(?=)/(?!)และการมองย้อนกลับ(?<=)/(?<!)
ถัดไป: นำทุกอย่างมารวมกันเพื่อทำความสะอาดข้อความสำหรับปัญญาประดิษฐ์
คำถามที่พบบ่อย
บทเรียน “กลุ่มจับและกลุ่มที่มีชื่อ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กลุ่มจับและกลุ่มที่มีชื่อ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn AI with Python ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กลุ่มจับและกลุ่มที่มีชื่อ”
วงเล็บสำหรับจับกลุ่ม กลุ่มที่มีชื่อ (?P ...) re.fullmatch() และการมองไปข้างหน้า/ข้างหลัง คุณปฏิบัติ Learn AI with Python ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn AI with Python หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn AI with Python บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “กลุ่มจับและกลุ่มที่มีชื่อ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn AI with Python นี้ได้ไหม
ได้ บทเรียน Learn AI with Python ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบนิพจน์ประจำและคลาสอักขระ
- โมดูล re: search, match, findall, sub
- กลุ่มจับและกลุ่มที่มีชื่อ
- การทำความสะอาดข้อความสำหรับปัญญาประดิษฐ์ด้วยนิพจน์ רגูลาร์