Nattawut Phetmak
Jack of all Trades
จากตอนก่อนๆ แม้ว่าเราจะสามารถใช้การ slice และ .format()
เล่นกับข้อความได้แล้ว แต่นั่นอาจไม่พอสำหรับการวิเคราห์ข้อความขั้นสูง ถ้าตรงนี้ถ้าใครเซีย regex แล้ว สามารถ import re
เข้ามาใช้ได้ครับ
import re
# init for this example
pattern = '@[a-zA-Z0-9_]+'
test = {}
test[0] = '@dave: @hal9000, open the pod bay doors.'
test[1] = 'twitter username pattern is @username'
test[2] = 'no one to be mention'
โดยสองคำสั่งนี้จะคืนค่าเป็น regex-object ถ้าตรวจเจอ pattern ที่ตรงครั้งแรก (และครั้งเดียว) และไม่คืนค่าถ้าหาไม่เจอ
# match: match from the beginning only
for i in range(3):
print(i, re.match(pattern, test[i]))
# get: regex-object on test[0] only
# search: match anywhere in string
for i in range(3):
print(i, re.search(pattern, test[i]))
# get: regex-object on test[0] and test[1]
# to get matched word from regex-object, use this
myobj = re.match(pattern, test[0])
print(myobj.group())
# get: @dave
ส่วนคำสั่งพวกนี้จะคืนค่าเป็น list ครับ
# findall: return list of all matched patterns
for i in range(3):
print(i, re.findall(pattern, test[i]))
# get:
# ['@dave', '@hal9000']
# ['@username']
# []
# split: return list of unmatched pattern
for i in range(3):
print(i, re.split(pattern, test[i]))
# get:
# ['', ': ', ', open the pod bay doors.']
# ['twitter username pattern is ', '']
# ['no one to be mention']
และสุดท้าย เราสามารถที่จะเปลี่ยน string ได้โดย
# sub: change matched pattern in the string
for i in range(3):
print(i, re.sub(pattern, '_who_', test[i]))
# get:
# _who_: _who_, open the pod bay doors.
# twitter username pattern is _who_
# no one to be mention
# change can also be callable function.
def name(reobj):
if reobj:
if reobj.group() == '@dave':
return 'David Bowman'
elif reobj.group() == '@hal9000':
return 'HAL'
else:
return reobj.group()
for i in range(3):
print(i, re.sub(pattern, name, test[i]))
# get:
# David Bowman: HAL, open the pod bay doors.
# twitter username pattern is @username
# no one to be mention