Regular Expression ฉบับมือใหม่และการใช้งานในภาษา Python
Regular Expression คืออะไร ? มีรูปแบบการเขียนยังไง
เวลาที่เราเขียนโค้ดอาจมีบางครั้งที่เราอยากจะตรวจสอบว่า 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 ของตัวเองก็สามารถคอมเม้นถามกันได้นะครับ ไว้จะเข้ามาเพิ่มตัวอย่างให้