top of page

ดึง pattern ข้อมูลด้วย Regular Expression

Updated: Aug 15, 2021

ข้อมูลอย่าง email เบอร์โทรศัพท์ ที่ข้อมูลเปลี่ยนตาม user แต่มี pattern ชัดเจน สามารถใช้ pattern ดึงข้อมูลโดยที่ไม่ต้องระบุข้อมูลได้! เรียนกับ Ultimate Python


Regular Expression

คือ เครื่องมือที่ใช้ดึงข้อมูลที่ต้องการจาก string ผ่านการกำหนด pattern ของข้อมูลที่ต้องการดึงโดยที่ไม่ต้องระบุข้อมูลที่ต้องการ ทำให้เราสามารถดึงข้อมูลที่ไม่ตายตัว แต่มี pattern ชัดเจนได้ เช่น email ที่มีการระบุ @, เบอร์โทรศัพท์ที่มีจำนวนตัวเลขคงที่ และอื่นๆ

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


นำเข้าเครื่องมือ

ในการใช้งาน regualr expression เราจะใช้ library ที่ชื่อว่า re ซึ่งสามารถนำมาใช้งานได้ทันที สามารถใช้คำสั่ง import re ดังตัวอย่างด้านล่าง


In [1]:
import re


การทำงานกับ Regular Expression

มีหลักสำคัญ คือ การทำความเข้าใจ pattern ของข้อมูลที่ต้องการ เพื่อระบุ pattern นั้นออกมาจาก string ที่เก็บข้อมูลนั้นๆ อยู่ หรือ ตรวจสอบว่ามี pattern ที่ระบุนั้นอยู่ใน string หรือไม่


การหาคำที่ต้องการ

จะใช้คำสั่ง .search() ที่จะรับ 2 ค่าคือ pattern และ string ที่ต้องการหาข้อมูล ซึ่งการระบุ pattern สามารถใช้ตัวอักษรที่ต้องการ หรือตัวอักษรพิเศษต่างๆ ที่ใช้สร้าง pattern โดยไม่ระบุตัวอักษรที่ต้องการค้นหาได้ เช่น

หา py ใน python

เราจะระบุ py เป็น pattern ในการค้นหา ใน string python ซึ่งเขียนได้ในลักษณะ เราจะได้ผลลัพธ์เป็น Match object ที่เก็บข้อมูลต่างๆ เช่น ตำแหน่งใน string ที่หา pattern เจอและคำที่หาเจอ หรือ match ตามที่ระบุตัวอักษร หรือ pattern ที่เจอใน string นั้นๆ

หากมีการเจอ pattern หลายครั้ง .search() จะดึงข้อมูลแรกที่หาเจอด้วย pattern โดยมีการค้นหาเรียงลำดับจาก index น้อยไปมากใน string


In [2]:
re.search('py','python')
Out[2]:
<re.Match object; span=(0, 2), match='py'>

หา py ใน pineapple

เราจะระบุ py เป็น pattern ในการค้นหา ใน string python ซึ่งเขียนได้ในลักษณะ สังเกตว่าเราจะได้ผลลัพธ์เป็น None ซึ่งแปลว่าไม่เจอ pattern ที่กำหนดใน string ที่กำหนด


In [3]:
re.search('py','pineapple')


ข้อมูล Match

เมื่อได้ obejct match จาก .search() มา เราสามารถใช้คำสั่ง เพื่อดึงข้อมูลออกมาดูเพิ่มเติมได้



In [4]:
result = re.search('py','python')
result
Out[4]:
<re.Match object; span=(0, 2), match='py'>

ตำแหน่งข้อมูลที่เจอ

ดูได้จาก method .span() จะได้ตำแหน่งของ pattern ที่ค้นหาเป็น tuple ของ เลขตำแหน่งเริ่มต้นของตัวอักษร และเลขตำแหน่งสุดท้ายของตัวอักษร


In [5]:
result.span()
Out[5]:
(0, 2)

ข้อมูลที่ดึงออกมาได้

โดยการดึงด้วยสัญลักษณ์ [ ] และระบุ index 0 ในลักษณะดังต่อไปนี้


In [6]:
result[0]
Out[6]:
'py'


การหาคำที่ต้องการ หลายตำแหน่ง

เราจะใช้คำสั่ง .findall() แทนซึ่งจะทำให้เราสามารถดึงข้อมูลจากหลายตำแหน่งได้ ซึ่ง .findall() จะรับข้อมูล 2 อย่างเช่นเดียวกัน นั่นคือ pattern และ string ซึ่งผลลัพธ์ที่ได้จาก .findall() จะได้ list ที่เก็บข้อมูล string ที่ดึงมาได้โดยการใช้ pattern ค้นหาจากใน string ที่กำหนด

หา py ใน string

ในการหาคำว่า py หลายตำแหน่งใน string ที่กำหนด สามารถเขียนได้ในลักษณะดังนี้


In [7]:
re.findall('py','python pycharm pineapple')
Out[7]:
['py', 'py']


การสร้าง pattern

สังเกตว่าหากเราใช้เพียงตัวอักษรปกติในการระบุข้อมูลที่เราต้องการ เป็นไปไม่ได้เลยที่เราจะได้ข้อมูลที่เราต้องการโดยการระบุ pattern เพราะเราต้องระบุข้อมูลที่ต้องการแบบเป๊ะๆ ทุกตัวอักษร

ซึ่งการสร้าง pattern เราจะใช้ตัวอักษรพิเศษแทนการใช้ตัวอักษรปกติ เพื่อกำหนด pattern ตามความหมายของแต่ละตัวอักษรพิเศษ แทนที่จะใช้คำที่ต้องการหา


การสร้าง pattern ด้วยตัวอักษรพิเศษ

ตัวอักษรพิเศษใน regular expression เป็นตัวอักษรที่มีความหมายสื่อถึง pattern ไม่ใช่ตัวอักษรที่เห็นได้ด้วยตาซึ่งมีหลายตัวให้เลือกใช้ประกอบเป็น pattern ที่ต้องการค้นหา

• wildcard

เป็นตัวอักษรพิเศษที่ใช้เพื่อสร้าง pattern เช่น . * ใช้เพื่อเป็นตัวแทนตัวอักษรต่างๆ หรือกำหนดการเกิดซ้ำ เช่น

. ตัวอักษรใดๆ

. สามารถใช้ระบุเป็น pattern เพื่อเป็นการแทนการมีอยู่ของ 1 ตัวอักษรใดๆ ในตำแหน่งของ . อย่างเช่น การค้นหาคำทุกคำที่มี 3 ตัวอักษรที่ขึ้นต้นด้วยตัวอักษรใดก็ได้ แต่ต้องลงท้ายด้วย at จาก string hat at car

สังเกตว่า ผลลัพธ์ที่ได้เป็น list ของ string ที่มีตัวอักษร 3 ตัว รวมไปถึงคำว่า ' at' ที่ประกอบด้วย เว้นว่าง 1 ตัวอัษร และ at


In [8]:
re.findall('.at','hat cat at car')
Out[8]:
['hat', 'cat', ' at']

* ตัวอักษรที่เกิด เกิดซ้ำ หรือไม่เกิดขึ้น

สามารถใช้ * เพื่อกำหนดการเกิดซ้ำให้กับตัวอักษรด้านหน้าได้ ซึ่ง * เป็นตัวอักษรพิเศษที่หมายถึงให้ดูตัวอักษรด้านหน้า และตั้งเป็น pattern ที่มีการเกิดตัวอักษรซ้ำ หรือไม่เกิดขึ้น เช่น การดึง


In [9]:
re.findall('so*','so soooooo s sooo')
Out[9]:
['so', 'soooooo', 's', 'sooo']

+ ตัวอักษรที่เกิด หรือ เกิดซ้ำ

สามารถใช้ + เพื่อกำหนดการเกิดซ้ำให้กับตัวอักษรด้านหน้าได้ ซึ่ง + เป็นตัวอักษรพิเศษที่หมายถึงให้ดูตัวอักษรด้านหน้า และตั้งเป็น pattern ที่มีการเกิดตัวอักษรซ้ำ หรือไม่เกิดขึ้น เช่น การดึง


In [10]:
re.findall('so+','so soooooo s sooo')
Out[10]:
['so', 'soooooo', 'sooo']

• set ของตัวอักษร

แทนที่เราจะหาตัวอักษรที่ระบุตายตัว 1 ตัว หรือการใช้เครื่องหมายที่กำตัวอักษรไว้ เช่น . หมายถึงทุกตัวอักษร เราสามารถสร้าง set ของตัวอักษรที่ต้องการประกอบการค้นหา โดยการใส่สัญลักษณ์ [ ] และใส่ตัวอักษรที่ต้องการเช็คไว้ระหว่าง [ ]

การใส่ set ตัวอักษร

ในการใช้ [ ] จะเป็นตัวแทนของ 1 ตัวอักษร ซึ่งเราสามารถใส่ตัวอักษรที่ต้องการค้นหาลงไประหว่าง [ ] เช่น ต้องการหาคำที่ ขึ้นต้นด้วย py หรือ Py เขียนเป็น set ได้เป็น [Pp]y ที่กำหนดตัวแรกเป็นไปได้ 2 ตัวอักษร และต้องตามด้วย y


In [11]:
re.findall('[Pp]y','python Pycharm pineapple')
Out[11]:
['py', 'Py']

การใส่ set ตัวอักษรเป็นช่วง

ในการกำหนด set ด้วย [ ] เราสามารถใส่ตัวอักษรที่สนใจเป็นช่วงอย่าง a-z A-Z 0-9 ลงไปใน [ ] ได้ เช่น การกำหนดตัวอักษรที่เป็นตัวอักษรภาษาอังกฤษทั้งตัวใหญ่ตัวเล็กเขียนได้ในลักษณะนี้ [a-zA-Z]

ประยุกต์ใช้การระบุตัวอักษรเป็นช่วงกับ wildcard เพื่อทำ pattern ในการดึงข้อมูลจากทั้งคำได้ดังนี้


In [12]:
re.findall('[Pp]y[a-zA-Z]*','python Pycharm pineapple')
Out[12]:
['python', 'Pycharm']

ตัวอย่างการดึงข้อมูล email


In [13]:
re.findall('xippar@[a-zA-Z]*.[a-zA-Z]*','xippar@gmail.com xippar@ultimatepython.co john@gmail.com')

Out[13]:
['xippar@gmail.com', 'xippar@ultimatepython.co']


เสร็จสิ้นการดึงข้อมูลด้วย regular expression


เรียนเรียน Python จาก 0 ฉบับวัยทำงานยุคใหม่

เริ่มไว ใช้ได้ทันที พร้อมการดูแลจากผู้สอนโดยตรง และกลุ่มแลกเปลี่ยนความรู้

เรียนรู้เกี่ยวกับคอร์สเรียนเพิ่มเติม https://ultimatepython.teachable.com/p/python-automation






4,789 views0 comments
bottom of page