Simon Willison's Weblog 39 วันที่แล้ว general AI Generated

Soft-deprecating re.match()

Simon Willison's Weblog 11 Sep 2026
69
0
100
3 11m



อัปเดต
Python


Python 3.15 เริ่มต้นยุค farewell กับ re.match() ฟังก์ชันที่หลอกคนมาตลอด



ชื่อใหม่ re.prefixmatch() บอกตรงๆ ว่ามันแมตช์แค่ต้นสตริง ไม่ใช่ทั้งสตริงอย่างที่ใครหลายคนเข้าใจผิด




ทีมข่าว เอไอไทย.com
⏱ อ่าน 3 นาที



บางทีปัญหาที่ใหญ่ที่สุดของฟังก์ชันหนึ่งอาจไม่ใช่บั๊ก แต่เป็นชื่อของมันเองนี่แหละ




ถ้าใครเคยเขียน Python แล้วงงกับ re.match() ว่า "ทำไมแมตช์ไม่เจอทั้งที่ข้อความมันมีอยู่นะ" — ข่าวนี้คือคำตอบว่าคุณไม่ได้โง่คนเดียว และทีมพัฒนาภาษา Python ก็รู้เรื่องนี้ดี



Python มีแนวคิดที่เรียกว่า "soft deprecation" ครับ คือการติดป้าย API ว่าต่อไปนี้ "ไม่ควรใช้เขียนโค้ดใหม่แล้ว" แต่ก็ไม่ได้สัญญาหรือขู่ว่าจะลบมันออกไปในอนาคต — เป็นการบอกใบ้แบบนุ่มนวล ไม่ได้ตัดหางปล่อยวัด



และเป้าหมายล่าสุดที่ถูกจับเข้าโครงการนี้ก็คือ re.match() ฟังก์ชันคลาสสิกที่อยู่คู่ Python มานาน แต่ก็สร้างความสับสนให้คนเขียนโค้ดมานานพอกัน



“
It's now available with the much clearer alternative re.prefixmatch() name - reflecting how it anchors at the beginning of the string but not the end.


ทำไมต้องเปลี่ยน


Hugo van Kemenade ผู้ดูแลการปล่อยเวอร์ชัน Python 3.15 อธิบายว่าเวอร์ชันที่กำลังจะมาถึงนี้จะเริ่ม soft deprecation ให้ re.match() พร้อมกับเปิดตัวชื่อใหม่ที่ชัดเจนกว่าอย่าง re.prefixmatch()



ชื่อใหม่นี้สื่อความหมายตรงตัวเลยครับ — มันแมตช์แพตเทิร์นที่จุดเริ่มต้นของสตริง แต่ไม่ได้ผูกกับจุดสิ้นสุด นั่นคือหัวใจของความสับสนทั้งหมดที่ผ่านมา หลายคนเข้าใจผิดว่า re.match() แมตช์ทั้งสตริง ซึ่งจริงๆ แล้วไม่ใช่



ปัญหาคือชื่อ "match" เฉยๆ มันกำกวมเกินไป มันไม่ได้บอกอะไรเลยว่าจุดจบของสตริงมีผลด้วยหรือเปล่า คนที่เพิ่งหัดเขียน regex ใน Python จึงมักเจอบั๊กเงียบๆ แบบนี้บ่อยครั้ง



แล้วควรใช้อะไรแทน


Simon Willison เจ้าของบล็อกต้นทางข่าวนี้ย้ำชัดว่า ในกรณีส่วนใหญ่คนเขียนโค้ดมักต้องการฟังก์ชันอื่นมากกว่า และเขาแจกแจงให้เห็นภาพแบบนี้




re.search()

ใช้เมื่ออยากแมตช์แพตเทิร์นที่ตำแหน่งไหนก็ได้ในสตริง



re.fullmatch()

ใช้เมื่อต้องการให้แพตเทิร์นต้องตรงกับทั้งสตริงตั้งแต่ต้นจนจบ



re.prefixmatch()

ชื่อใหม่แทน re.match() สำหรับกรณีที่ต้องการแมตช์เฉพาะต้นสตริงจริงๆ


จะเห็นว่าการแยกชื่อให้ตรงกับพฤติกรรมจริงแบบนี้ช่วยลด cognitive load ของคนอ่านโค้ดได้เยอะมาก โค้ดที่เขียนด้วย re.search() กับ re.fullmatch() จะสื่อเจตนาของคนเขียนได้ชัดตั้งแต่อ่านชื่อฟังก์ชัน ไม่ต้องไปเปิด docs เช็คพฤติกรรมทีหลัง



ส่วน re.match() เองก็ยังใช้ได้อยู่ ไม่ได้หายไปไหน แค่ถูกติดป้ายว่า "ไม่ควรใช้กับโค้ดใหม่" เท่านั้น ซึ่งก็เป็นวิธีจัดการที่ฉลาดกว่าการลบออกทันที เพราะโค้ดเก่าในระบบ production ทั่วโลกยังเรียกใช้มันอยู่เพียบ การลบตรงๆ คงเกิดเสียงด่าทั่วโลกแน่นอน



💡

นี่คือตัวอย่างชั้นดีที่แสดงว่าชื่อฟังก์ชันที่ไม่ชัดเจนมันสร้างหนี้ทางเทคนิคได้จริง การตั้งชื่อให้ตรงกับพฤติกรรมตั้งแต่แรกคือการลงทุนที่ถูกที่สุด และ re.prefixmatch() ก็มาชดเชยความสับสนที่ re.match() สร้างไว้หลายสิบปี



ที่มา: Simon Willison's Weblog — อ่านต้นฉบับ


#python #regex #programming

🔗 อ่านต่อ · สินค้าและคำถามที่เกี่ยวข้อง

สินค้ามาแรงตอนนี้

คนขายของถามบ่อย

ความคิดเห็น 6

กำลังโหลดความคิดเห็น...