แสดงบทความที่มีป้ายกำกับ regular expression แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ regular expression แสดงบทความทั้งหมด

วันพฤหัสบดีที่ 18 มิถุนายน พ.ศ. 2552

Regular Expression in Python

วันอาทิตย์ที่ 14 มิถุนายน พ.ศ. 2552

Regular Expression Function

Regular Expression มีฟังก์ชั่นการทำงานดังต่อไปนี้


>>>import re
>>>pat = 'Hello'
>>>raw = 'Hello world. Hello you.'


compile(pat) เป็นการคอมไพล์ข้อความรูปแบบ โดยจะคืนค่ามาเป็น Pattern object


>>>re.compile(pat)
>>><_sre.SRE_Pattern object at 0x01357500>


re.findall(pat,raw) เป็นการค้นหาในส่วนของข้อความและจะคืนข้อความทั้งหมดที่ตรงกับรูปแบบกำหนดในรูปแบบ list


>>>re.findall(pat,raw)
>>>['Hello', 'Hello']


re.finditer(pat,raw) เป็นการค้นหาในส่วนของข้อความและจะคืนข้อความทั้งหมดที่ตรงกับรูปแบบกำหนดเหมือนกับ findall แต่จะคืนในรูปแบบ iterator


>>>re.finditer(pat,raw)
>>>


re.match(pat,raw) เป็นการค้นหาในส่วนของข้อความและจะคืนข้อความในรูปแบบ Match object


>>>re.match(pat,raw)
>>><_sre.SRE_Match object at 0x01FA7BF0>


re.search(pat,raw) เป็นการค้นหาในส่วนของข้อความและจะคืนข้อความในรูปแบบ Match object แต่ต่างจาก match ตรงที่จะรู้ตำแหน่งด้วย


>>>re.search(pat,raw)
>>><_sre.SRE_Match object at 0x01FA7BF0>


re.split(pat,raw) เป็นการตัดแบ่งข้อความด้วยรูปแบบที่ต้องการ


>>>re.split(pat,raw)
>>>['', ' world. ', ' you.']


re.sub(pat, 'new text', raw) เป็นการแทนข้อความที่เรากำหนดตรงตำแหน่งที่เราใส่รูปแบบที่ต้องการ


>>>re.sub(pat,'Sawasdee', raw)
>>>'Sawasdee world. Sawasdee you.'


re.subn(pat,'Sawasdee',raw) เป็นการแทนข้อความที่เรากำหนดตรงตำแหน่งที่เราใส่รูปแบบที่ต้องการ แต่จะคืนเป็น tuple เป็นข้อความใหม่กับ จำนวนข้อความที่ถูกเปลี่ยน


>>>re.subn(pat,'Sawasdee',raw)
>>>('Sawasdee world. Sawasdee you.', 2)


re.template(pat) เป็นการสร้าง object Pattern ตามที่รูปแบบที่เราต้องการ เหมือนการ compile


>>>re.template(pat)
>>><_sre.SRE_Pattern object at 0x013576A0>

วันพุธที่ 20 พฤษภาคม พ.ศ. 2552

Regular Expression Syntax (3)

ชุดสุดท้ายใน Regular Expression Syntax

{m} วางไว้หลังอักษรที่ต้องการบอกจำนวนที่ซ้ำได้


>>> import re
>>> my_pattern = 'a{2}'
>>> raw_string = 'a aa a aa'
>>> re.sub(my_pattern,'-',raw_string)
'a - a -'


{m,n} วางไว้หลังอักษรที่ต้องการบอกจำนวนที่ซ้ำได้ โดยระบุเป็นช่วงตัวเลข


>>> my_pattern = 'a{2,4}'
>>> raw_string = 'a aa aaa aaaa aaaaa'
>>> re.sub(my_pattern,'-',raw_string)
'a - - - -a'


[] เป็นการระบุช่วงตัวอักษรที่ต้องการ


>>> my_pattern = '[A-Z]'
>>> raw_string = 'Apple Banana'
>>> re.sub(my_pattern,'-',raw_string)
'-pple -anana'


'|' ใช้ร่วมกับ [] โดยมีความหมายว่า หรือ ใช้คั่นระหว่างตัวอักษรที่ต้องการเลือก


>>> my_pattern = '[c|b]at'
>>> raw_string = 'cat rat bat'
>>> re.sub(my_pattern,'-',raw_string)
'- rat -'


() ใช้จัดกลุ่มให้ข้อความที่อยู่ภายในโดยสามารถใช้ร่วมกับสัญลักษณ์อื่นๆ จากตัวอย่างจะเห็นว่า (ab)+ การซ้ำนั้นจะเป็นการซ้ำของ ab ซึ่งจะแตกต่างกับ ab+ นั้นการซ้ำนั้นจะซ้ำเฉพาะตัว b


>>> my_pattern = '(ab)'
>>> raw_string = 'aa ab bb'
>>> re.sub(my_pattern,'-',raw_string)
'aa - bb'
>>> my_pattern = '(ab)+'
>>> raw_string = 'aa ab abab baba'
>>> re.sub(my_pattern,'-',raw_string)
'aa - - b-a'

วันอังคารที่ 19 พฤษภาคม พ.ศ. 2552

Regular Expression Syntax (2)

มาต่อกับสัญลักษณ์ที่เหลือของ regular expression ในภาษาไพธอน

"." หมายถึง แทนตัวอักษรอะไรก็ได้


>>> import re
>>> my_pattern = '.at'
>>> raw_string = 'I love rat and cat'
>>> re.sub(my_pattern,'dog',raw_string)
'I love dog and dog'


"^" หมายถึง คำที่อยู่ด้านหน้า โดยวางไว้ข้างหน้าคำที่ต้องการค้นหา เหมือน \A


>>> my_pattern = '^dog'
>>> raw_string = 'dog dog dog'
>>> re.sub(my_pattern,'cat',raw_string)
'cat dog dog'


"$" หมายถึง คำที่อยู่ด้านหลัง โดยวางไว้ข้างหลังคำที่ต้องการค้นหา เหมือน \Z


>>> my_pattern = 'dog$'
>>> raw_string = 'dog dog dog'
>>> re.sub(my_pattern,'cat',raw_string)
'dog dog cat'


"*" เอาไว้ท้ายอักษรที่ต้องการสื่อว่าไม่มี หรือ มี และก็ซ้ำได้ด้วย


>>> my_pattern = 'ab*'
>>> raw_string = 'aa , abb , abbb , ba , bb , bc'
>>> re.sub(my_pattern,'-',raw_string)
'-- , - , - , b- , bb , bc'


"+" เอาไว้ท้ายอักษรที่ต้องการสื่อต้องมี และก็ซ้ำได้ด้วย


>>> my_pattern = 'ab+'
>>> raw_string = 'aa , abb , abbb , ba , bb , bc'
>>> re.sub(my_pattern,'-',raw_string)
'aa , - , - , ba , bb , bc'


"?" เอาไว้ท้ายอักษรที่ต้องการสื่อว่าไม่มี หรือ มี แต่ซ้ำไม่ได้


>>> my_pattern = 'ab?'
>>> raw_string = 'aa , abb , abbb , ba , bb , bc'
>>> re.sub(my_pattern,'-',raw_string)
'-- , -b , -bb , b- , bb , bc'

วันอาทิตย์ที่ 17 พฤษภาคม พ.ศ. 2552

Regular Expression Syntax

ส่วนประกอบที่สำคัญในการทำ regular expression คือ ตัว patterns ที่ใช้ในการค้นหา จากคราวที่แล้ว จะพบว่า \b นั้นอยู่ในคำที่ต้องการค้นหา ได้แก่ r'\bROAD\b' ซึ่ง \b เป็น syntax ที่มีความหมายพิเศษ ซึ่งในไพธอนนั้นจะมี syntax และวิธีการใช้แต่ต่างกันไปดังนี้ ขั้นแรกก็


>>>import re


\A หมายถึงต้องเป็นต้นประโยค จากตัวอย่าง Mister จะถูกเปลี่ยนเฉพาะคำแรก

>>>my_pattern = '\AMister'
>>>raw_string = 'Mister python and Mister Thailand'
>>>re.sub(my_pattern,'MR.',raw_string)
'MR. python and Mister Thailand'


\b หมายถึงต้องเป็นขอบของคำ จากตัวอย่างเดิม คำว่า BROAD จะไม่ถูกเปลี่ยนข้างหน้า R ยังมีตัว B ทำให้ R ไม่เป็นขอบของคำ

>>>import re
>>>s = '100 NORTH BROAD ROAD'
>>>re.sub(r'\bROAD\b', 'RD.', s)
'100 NORTH BROAD RD.'


\B ตรงข้ามกับ \b คือคำนั้นต้องเป็นส่วนข้างใน

>>>my_pattern = '\BROAD'
>>>raw_string = 'BROAD ROAD'
>>>re.sub(my_pattern,'RD.',raw_string)
'BRD. ROAD'


\d หมายถึงตัวเลข


>>>my_pattern = '\d'
>>>raw_string = 'credit number 1234-1234-1234'
>>>re.sub(my_pattern,'x',raw_string)
'credit number xxxx-xxxx-xxxx'


\D ตรงข้ามกับ \d คือทุกอย่างที่ไม่ใช่ตัวเลข


>>>my_pattern = '\D'
>>>raw_string = 'credit number 1234-1234-1234'
>>>re.sub(my_pattern,'x',raw_string)
'xxxxxxxxxxxxxx1234x1234x1234'


\s หมายถึงช่องว่าง


>>>my_pattern = '\s'
>>>raw_string = 'a b c d e'
>>>re.sub(my_pattern,'_',raw_string)
'a_b_c_d_e'


\S ตรงข้ามกับ \s คือทุกอย่างที่ไม่ใช่ช่องว่าง


>>>my_pattern = '\S'
>>>raw_string = 'a b c d e'
>>>re.sub(my_pattern,'_',raw_string)
'_ _ _ _ _'


\w หมายถึงตัวอักษรและตัวเลข โดยจะไม่เอาสัญลักษณ์ต่างๆ


>>>my_pattern = '\w'
>>>raw_string = 'a!b#c%d&e.'
>>>re.sub(my_pattern,'_',raw_string)
'_!_#_%_&_.'


\W ตรงข้ามกับ \w คือพวกสัญลักษณ์ต่างๆ

>>>my_pattern = '\W'
>>>raw_string = 'a!b#c%d&e.'
>>>re.sub(my_pattern,'_',raw_string)
'a_b_c_d_e_'


\z หมายถึงต้องอยู่สุดท้ายของข้อความ


>>>my_pattern = 'Mister\Z'
>>>raw_string = 'Mister and Mister'
>>>re.sub(my_pattern,'MR.',raw_string)
'Mister and MR.'

วันศุกร์ที่ 15 พฤษภาคม พ.ศ. 2552

Regular Expression (2)

จากคราวที่แล้วนั้นจะเห็นความจำเป็นที่ต้องให้งาน regular expression ก็มาต่อถึงวิธีการใช้งานโดยขั้นแรกต้องเรียกใช้ module re ก็จะสามารถที่ใช้งานฟังก์ชั่นต่างได้ ซึ่งการเขียน regular expression ในไพธอนนั้นมีรูปแบบในการเขียนแบบเดียวกับภาษา Perl ตัวอย่างต่อเนื่องจากคราวที่แล้วที่ต้องการเปลี่ยนคำว่า ROAD ให้เป็นคำย่อว่า RD


>>>import re
>>>s = '100 NORTH BROAD ROAD'
>>>re.sub(r'\bROAD\b', 'RD.', s)
'100 NORTH BROAD RD.'


จะพบว่าคำที่เปลี่ยน มีแค่ ROAD เป็น RD. แต่ชื่อถนน BROAD นั้นไม่เปลี่ยนแปลง โดยที่ re.sub เป็นฟังก์ชั่นในการค้นหาและเปลี่ยนคำตามที่เราต้องการซึ่งรับข้อมูล ส่วน r'\bROAD\b' เป็นรูปแบบข้อความที่ค้นหา 'RD.' เป็นคำที่ต้องการนำไปแทนที่และ s คือข้อความต้นฉบับ

reference
http://www.diveintopython.org/regular_expressions/street_addresses.html

วันพฤหัสบดีที่ 14 พฤษภาคม พ.ศ. 2552

Regular Expression

regular expression คือการสร้างรูปแบบของข้อความ เพื่อใช้ในการหา,เปลี่ยนแปลง หรือ ตรวจสอบความถูกต้อง

ทำไมต้องใช้ regular expression
ยกตัวอย่าง เมื่อเราต้องการเปลี่ยนคำบางคำเป็นคำย่อ เช่น '100 NORTH MAIN ROAD'
อย่างนี้เราสามารถใช้ replace ในการเปลี่ยนได้ดังนี้


>>> s = '100 NORTH MAIN ROAD'
>>> s.replace('ROAD', 'RD.')
'100 NORTH MAIN RD.'


แต่ถ้าถนนไม่ใช่ MAIN ROAD แต่เป็น BROAD ROAD ผลที่เกิดคือ


>>> s = '100 NORTH BROAD ROAD'
>>> s.replace('ROAD', 'RD.')
'100 NORTH BRD. RD.'


ทำให้ชื่อของถนนนั้นผิด ดังนั้นจึงต้องให้ regular expression ช่วยจัดการครับ

reference
http://www.diveintopython.org/regular_expressions/street_addresses.html

Next >>