Regular Expression ฉบับมือใหม่และการใช้งานในภาษา Python

Regular Expression คืออะไร ? มีรูปแบบการเขียนยังไง

Tanabodin Kamol
3 min readJul 15, 2020

--

เวลาที่เราเขียนโค้ดอาจมีบางครั้งที่เราอยากจะตรวจสอบว่า Email หรือ password ของเรามีรูปแบบ pattern ตามที่เราต้องการหรือไม่ ซึ่งตรงนี้เราจะใช้สิ่งที่เรียกว่า Regular Expression(RegEx) Ok แล้ว RegEx คืออะไร ?

Regular Expression คือรูปแบบ(pattern) หรือกลุ่มคำที่เราจะนำมาใช้ในการหาข้อความตามที่เรากำหนด ในความเป็นจริงมันคือโปรแกรมขนาดเล็กที่ถูกฝังลงในภาษาต่าง ๆ และถูกเขียนเป็น module ขึ้นมาให้เราเรียกใช้

จริง ๆ RegEx Pattern จะเหมือนกันในทุกภาษานะครับ แต่ในที่นี้ผมขอใช้ Python เพื่อยกตัวอย่างคำสั่งไปด้วยนะครับ

Metacharacters

ตัวอักษรที่มีความหมายพิเศษต่าง ๆ

Special Sequences

จะขึ้นต้นด้วย \ แล้วตามด้วยตัวอักษรต่าง ๆ ซึ่งมีความหมายแตกต่างกัน

ตัว Metacharacter กับ Special Sequences จะเป็นส่วนที่ใช้ร่วมกันทุกภาษา ที่นี้มาดูในส่วนของ method ที่มีให้ใช้ใน Python บ้าง โดยจะมี 4 ตัวด้วยกัน

match()    # ตรวจสอบว่า regex ตรงกับ string ตัวแรกตรงไหน
search() # ค้นหาทั้ง string ที่ regex pattern ของเราไป match
# ทั้ง match(), search() จะ return `None` ถ้าไม่พบค่าจาก pattern ถ้าพบจะ return `match object`
findall() # ค้นหา string ทั้งหมดที่ regex ตรงกัน แล้ว return เป็น list
finditer() # ค้นหา string ทั้งหมดที่ regex ตรงกัน แล้ว return เป็น iterator
# เพิ่มมาอีกตัวเพราะผมใช้บ่อย
sub() # ใช้เพื่อ replace data ที่ตรงกับ regex ของเรา

RegEx in Python

การที่เราจะเริ่มใช้งาน regex ใน python นั้นง่ายมาก เพียงแค่เรา import re module เข้ามาก็สามารถใช้งานได้แล้ว

import re# ตัวอย่างการใช้ search(pattern, string)
email = "testmail@mail.com"
email_pattern = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
x = re.search(email_pattern, email)
if x:
print("email pattern match")
else:
print("no match")

ตัว re.match() กับ re.search() มีความแตกต่างกันเพียงแค่ re.match() จะใช้ค้นหาเพียงช่วงต้นของ string ในขณะที่ re.search() จะค้นหาทั้ง string ว่ามีค่าที่ตรงกับ pattern ของเราหรือไม่

import reSubstring = 'string'String ='''We are learning regex, regex is very useful for string matching.'''# re.search() Method 
print(re.search(Substring, String, re.IGNORECASE))
# <_sre.SRE_Match object; span=(48, 54), match='string'>
# re.match() Method
print(re.match(Substring, String, re.IGNORECASE))
# None

เราใช้ re.IGNORECASE เพื่อไม่สนใจ case sensitive(ตัวเล็กตัวใหญ่) ของ string

import retxt = '''
Hi welcome everyone that read my blogs
Thank you all for follower
'''
# re.findall() Method
x = re.findall(r"(\w{5,8})", txt)
print(x)
# ['welcome', 'everyone', 'blogs', 'Thank', 'follower']
# ผลของการใช้ re.findall() คือค่าที่ได้จะกลับมาในรูปแบบของ list
# re.finditer() Method
for x in re.finditer(r"(\w{5,8})", txt):
print(x)
# <_sre.SRE_Match object; span=(4, 11), match='welcome'>
# ...
# <_sre.SRE_Match object; span=(58, 66), match='follower'>

# ค่าที่ได้ออกมาก็จะเป็น iterator ซึ่งเราต้องนำไป loop รับค่าของ `match object` แล้วแสดงผล

เอ๊ะ !! แล้ว match object เนี่ย มี data อะไรให้เราบ้าง ?

.span()   # return tuple ที่มีตำแหน่งเริ่มและสิ้นสุดของ pattern
.string # return string ที่เราใช้ในการทำ regex ทั้งก้อน
.group() # return ค่าของ string เฉพาะส่วนที่ match

เหลือตัวสุดท้ายแล้วก็คือ sub() ซึ่งตัวนี้เราจะใช้ในการ replace ค่าที่ match กับ pattern ด้วยค่าที่เราต้องการ

import retxt = "something must be happen here 123 456"
x = re.sub(r"(\d)+$", "", txt)
print(x)
# something must be happen here 123
# เราให้ลบค่าที ่match กับ pattern ของเราในที่นี่คือตัวเลขชุดสุดท้าย
x = re.sub(r"(\w) (\d)", r"\1\2", txt)
print(x)
# something must be happen here123456
# อันนี้ผมใช้ regex ในการ replace โดยให้ลบ ช่องว่างระหว่าง group 1, 2 (ใส่ r นำหน้า string)

ครบทั้งหมดแล้วในส่วนของการทำ regex สำหรับ Python จากนี้ก็ขึ้นอยู่กับ pattern ที่เราต้องการจะดักแล้วว่าจะเขียนยังไง หรือมีความต้องการยังไงก็ต้องลองไปประยุกต์กันดู

โดยปกติพวก regex ทั่วไปที่นิยมใช้กันจำพวก email, password, birthday เราอาจจะสามารถหาได้ทั่วไปใน internet แต่ก็อาจมีบ้างอย่างที่เราอยากเขียนขึ้นมาเอง เราสามารถไปลองเขียน regex ของเราที่ https://regex101.com/ ก่อนได้ เพื่อให้มองเห็นภาพได้ง่ายขึ้น

มาแถมให้ Example

email pattern : หากเราต้องการดัก string ว่ามีรูปแบบเป็น email หรือไม่นะครับ ก็จะมีการเขียนเพื่อตรวจสอบประมาณนี้ (ยกมาจากข้างบน)

import repattern = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
string = "tanabodin.testregex@mail.com"
result = re.search(pattern, string)
print("Match" if result else "Not match")

ถ้าติดปัญหาในการสร้าง regex ของตัวเองก็สามารถคอมเม้นถามกันได้นะครับ ไว้จะเข้ามาเพิ่มตัวอย่างให้

REFERENCE

  1. https://docs.python.org/3/howto/regex.html

--

--

Tanabodin Kamol

I always self-study about electronic devices and computer programming, So, I will share what I have learned for all of you! Sometime It’s code for Python