Regex

จากตอนก่อนๆ แม้ว่าเราจะสามารถใช้การ 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

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus