13 ธันวาคม 2558

Published ธันวาคม 13, 2558 by with 1 comment

Regular expression ภาษาไทย (และภาษาอื่น ๆ ) กับภาษาไพทอน

สวัสดีผู้อ่านทุกท่าน หลาย ๆ ท่านคงได้เคยลองใช้ Regular expression ในภาษาไพทอน โดยกำหนดรูปแบบเป็นภาษาไทย (หรือภาษาญี่ปุ่นและภาษาอื่น ๆ ที่ไม่ใช่ภาษาอังกฤษ) แต่พบว่าไม่สามารถใช้งาน Regular expression ภาษาไทย (หรือภาษาญี่ปุ่นและภาษาอื่น ๆ ที่ไม่ใช่ภาษาอังกฤษ) เหมือนภาษาอังกฤษกับภาษาไพทอนได้
บทความนี้ผมจะพาผู้อ่านไปแก้ไขปัญหาเรื่องนี้กันครับ
ทางออกของปัญหานี้
คือ ใช้การเข้ารหัส unicode เข้ามาช่วยได้ เพราะภาษาไพทอน (Python)  สนับสนุน unicode

อ่านเพิ่มเติม Regular expression กับภาษา Python

ตัวอย่างการทำ Regular expression ภาษาไทยกับภาษาไพทอน


มีประโยคหนึ่ง
You name is นก

นำเข้าไปในภาษาไพทอน โดยใส่การเข้ารหัส unicode ไว้

[python]
text = u'You name is นก'[/python]

เราต้องการเอาข้อความภาษาไทยคำว่า "นก" ออกมาจากประโยคนี้ โดยเขียน Regular expression ให้อยู่ในช่วง ก ถึง ฮ
ถัดมา ทำการหารหัส unicode ของ ก และ ฮ
รหัส unicode ของ ก คือ 0E01
รหัส unicode ของ ฮ คือ 0E2E
เมื่อนำรหัส unicode เข้ามาในภาษาไพทอนต้องเติม \u ไว้ข้างหน้ารหัสเหล่านี้ด้วยเสมอ
สามารถป้อนตัวอักษรเพื่อหารหัส unicode ได้จาก http://unicode-table.com/th/

พอได้รหัส unicode แล้วนำมาเขียน Regular expression จะเป็นดังนี้

[python]th = u'[\u0E01-\u0E2E]+'[/python]

หรือถ้าไม่อยากใช้รหัส unicode สามารถเขียนเป็น

[python]th = u'[ก-ฮ]+'[/python]

โดยจะไล่ตามการจัดเรียงรหัส unicode ที่กำหนดไว้แต่ละภาษา

นำมาแยกข้อความภาษาไทยคำว่า "นก" ออกมาจากประโยค

[python]
match = re.search(th, text, re.U) # re.U เป็นคำสั่งใช้ Regular expression ใน unicode
print(match.group())[/python]

ผลลัพธ์
นก

โค้ดฉบับเต็ม

[python]
import re
text = u'You name is นก'
th = u'[\u0E01-\u0E2E]+' # หรือใช้โค้ด th = u'[ก-ฮ]+'
match = re.search(th, text, re.U) # re.U เป็นคำสั่งใช้ Regular expression ใน unicode
print(match.group())
[/python]

นอกจากภาษาไทยแล้ว เราสามารถนำหลักการการทำ Regular expression ด้วย unicode ไปใช้งานกับภาษาอื่น ๆ ที่รองรับ unicode ได้

ตัวอย่างโค้ดภาษาญี่ปุ่น

[python]
import re
str = u'[DMSM-8433] 加護亜依 Kago Ai – 加護亜依 vs. FRIDAY'
regex = u'[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]+ (?=[A-Za-z ]+–)'
p = re.compile(regex, re.U)
match = p.sub("", str)
print(match)[/python]

เดติดโค้ดภาษาญี่ปุ่นจาก https://stackoverflow.com/a/32868484

ปรับปรุงครั้งที่ 1 เพิ่มเติมเนื้อหา ขอขอบคุณ คุณ Shinz Natkid จากกลุ่ม Python-Thailand มา ณ ที่นี้ครับ

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

1 ความคิดเห็น:

แสดงความคิดเห็นได้ครับ :)