Python Regular Expressions

Python regular expressions

Regular Expressions

Search болон extract(задлан шинжлэх) хийхэд маш их тус болдог Python-ийн хүчирхэг module байдаг ба үүнийг Regular expressions гэж нэрлэдэг.

Энэ хичээлээр бидний суралцах зүйлс

  • Character matching in regular expressions
  • Extracting data using regular expressions
  • Combining searching and extracting
  • Escape character
  • Bonus section for Unix / Linux users

Character matching in regular expressions

Character matching in regular expressions

Илүү хүчирхэг regular expressions бүтээх боломжийг бидэнд олгодог өөр хэд хэдэн тусгай тэмдэгтүүд байдаг. Хамгийн түгээмэл хэрэглэгддэг тусгай тэмдэгт бол ямар ч тэмдэгттэй тохирох period буюу full stop юм.

Дараах жишээнд regular expressions F..m: нь "From:", "Fxxm:", "F12m:", эсвэл "F!@m:" тэмдэгтүүдийн альнд нь ч таарна.

F үсгээр эхэлж M-ээр төгссөн мөрүүдийг хайх хайлт:

                        
                        import re
                        hand = open('mbox-short.txt')
                        for line in hand:
                            line = line.rstrip()
                                if re.search('^F..m:', line):
                                    print(line)
                        
                    

Дараах жишээн дээр repeated wild card тэмдэгтийг судлъя.

                        
                    import re
                    hand = open('mbox-short.txt')
                    for line in hand:
                        line = line.rstrip()
                            if re.search('^From:.+@', line):
                                print(line)
                        
                    
                        
                    Жишээлбэл ийм хайлт хэвлэж харуулна:
                    From: stephen.marquard@uct.ac.za
                    From: louis@media.berkeley.edu
                    From: zqian@umich.edu
                    From: rjlowe@iupui.edu
                        
                    

^From:.+@^From:.+@-ийг тайлбарлавал:

  • ^ тэмдэгт : ^-ээс ардах string-ээр эхэлсэн хайлтыг хайна гэсэн үг. Тиймээс From: гэж эхэлсэн хайлтыг харуулна.
  • .+ тэмдэгт : . нь ямарч тэмдэгт харуулж болно. +-ийн ардах тэмдэгт 1 болон түүнээс олоныг хайлтыг харуулж болно.
  • @ тэмдэгт : Зөвхөн @ тэмдэгттэй хайлтыг харуулна.

Extracting data using regular expressions

Extracting data using regular expressions

Хэрэв бид Python дахь string-ээс өгөгдлийг задлахыг хүсвэл findall() аргыг ашиглан regular expression-тэй таарч байгаа бүх substring-ийг гаргаж авч болно.

Дараахь программ нь findall()-г ашиглан и-мэйл хаягтай мөрүүдийг олж, тэдгээр мөр бүрээс бүх и-мэйл хаягийг гаргаж авна.

                        
        import re
        s = 'A message from csev@umich.edu to cwen@iupui.edu about meeting'
        lst = re.findall('\S+@\S+', s)
        print(lst)
                        
                    

үр дүн нь:

                        
                                [
                                'csev@umich.edu',
                                'cwen@iupui.edu'
                                ]
                        
                    

\S+@\S+-ийг тайлбарлавал:

  • /S+ тэмдэрт: Энэ нь нэг буюу хэд хэдэн хоосон зайгүй тэмдэгтийг хайна.
  • @ тэмдэрт: Зөвхөн @ тэмдэгттэй хайлтыг харуулна.
  • \S+ тэмдэрт: Энэ нь нэг буюу хэд хэдэн хоосон зайгүй тэмдэгтийг хайна.

Энгийнээр тайлбарлавал @ тэмдэгттэй ард урдаа хоосон зайгүй үгийг хайж байна гэсэн үг.

Файлын бүх мөрийг уншиж, имэйл хаяг шиг харагдах бүх зүйлийг дараах байдлаар хэвлэхийн тулд програмд доорх regular expression-г ашиглаж болно.

                            
                        import re
                        hand = open('mbox-short.txt')
                        for line in hand:
                        line = line.rstrip()
                        x = re.findall('\S+@\S+', line)
                        if len(x) > 0:
                        print(x)
                            
                        

Үр дүн нь:

                            
                        ['< source@collab.sakaiproject.org>;']
                        ['< source@collab.sakaiproject.org>;']
                        ['apache@localhost']
                        ['source@collab.sakaiproject.org;']
                        ['cwen@iupui.edu']
                        ['source@collab.sakaiproject.org']
                        ['cwen@iupui.edu']
                        ['cwen@iupui.edu']
                        ['wagnermr@iupui.edu']
                            
                        

Зарим имэйл хаягууд "<" эсвэл ";" гэх мэт илүү тэмдэгтүүд байна.

Зөв хайлтыг харуулахын тулд өөр нэг regular expression ашиглацгаая. Дөрвөлжин хаалт нь хайлтад оруулахыг хүсч буй тэмдэгтүүдийг зааж өгөхөд ашиглагддаг.

Шинэ regular expression-ууд:

                        
                            [a-zA-Z0-9]\S*@\S*[a-zA-Z]
                        
                    

Тайлбарлавал:

  • [a-zA-Z0-9] тэмдэрт: Энэ нь single alphanumeric тэмтэгт буюу A-аас z хүртэлх үсэг, жижиг эсвэл том үсгээр эсвэл 0-ээс 9 хүртэлх цифрийг хэлнэ.
  • /S+ тэмдэрт: Энэ нь нэг буюу хэд хэдэн хоосон зайгүй тэмдэгтийг хайна.
  • @ тэмдэрт: Зөвхөн @ тэмдэгттэй хайлтыг харуулна.
  • \S+ тэмдэрт: Энэ нь нэг буюу хэд хэдэн хоосон зайгүй тэмдэгтийг хайна.
  • [a-zA-Z] тэмдэрт: Энэ нь и-мэйлтэй төстэй загвар нь үсэг, тоон тэмдэгтээр, ялангуяа жижиг эсвэл том үсгээр a-аас z хүртэлх үсгээр төгсдөг. Энэ нь тэмдэгтүүд эсвэл тусгай тэмдэгтүүдээр төгссөн имэйл хаягуудыг харуулахгүй.

Хэрэв бид энэ илэрхийлэлийг програмдаа ашиглавал бидний өгөгдөл илүү цэвэр болно:

                        
            import re
            hand = open('mbox-short.txt')
            for line in hand:
                line = line.rstrip()
                x = re.findall('[a-zA-Z0-9]\S*@\S*[a-zA-Z]', line)
                if len(x) > 0:
                    print(x)
                        
                    

Үр дүн нь:

                        
                ['wagnermr@iupui.edu']
                ['cwen@iupui.edu']
                ['postmaster@collab.sakaiproject.org']
                ['200801032122.m03LMFo4005148@nakamura.uits.iupui.edu']
                ['source@collab.sakaiproject.org']
                ['source@collab.sakaiproject.org']
                ['source@collab.sakaiproject.org']
                ['apache@localhost']
                        
                    

Combining searching and extracting

Combining searching and extracting

Хэрэв бид "X-" тэмдэгт мөрөөр эхэлсэн мөрүүдээс тоонуудыг олохыг хүсвэл жишээлбэл:

                        
                        X-DSPAM-Confidence: 0.8475
                        X-DSPAM-Probability: 0.0000
                        
                    

Шинэ regular expression-ууд:

                        
                            ^X-.*: [0-9.]+
                        
                    

Тайлбарлавал:

  • ^ тэмдэрт: Мөрийн эхлэлийг илэрхийлнэ.
  • X тэмдэрт: Зөвхөн X үсэгтэй хайлтыг харуулна.
  • \S* тэмдэрт: X тэмдэгтийн араас хоосон зай байхгүй гэсэн үг.
  • : тэмдэрт: Зөвхөн : тэмдэгттэй хайлтыг харуулна.
  • [0-9.]+ тэмдэрт: [0-9.] Цифр эсвэл цэгийг харуулна. + Олон давталтийг харуулна. Жишээлбэл ..9991122 хэдэнч цэг тоо харуулж болно гэсэн үг.

Хэрэв бид энэ илэрхийлэлийг програмдаа ашиглавал:

                        
                    import re
                    hand = open('mbox-short.txt')
                    for line in hand:
                        line = line.rstrip()
                        if re.search('^X\S*: [0-9.]+', line):
                        print(line)
                        
                    

Үр дүн нь:

                        
                        X-DSPAM-Confidence: 0.8475
                        X-DSPAM-Probability: 0.0000
                        X-DSPAM-Confidence: 0.6178
                        X-DSPAM-Probability: 0.0000
                        
                    

Regular expression-ий өөр нэг тусгай тэмдэгт нь хаалт () юм. findall()-ийг хэрэглэж байхад хаалтыг хэрэглэвэл хаалт дотрохыг зөвхөн харуулна гэсэн үг.

Хэрэв энэ илэрхийлэлийг програмдаа ашиглавал:

                        
                    import re
                    hand = open('mbox-short.txt')
                    for line in hand:
                        line = line.rstrip()
                        x = re.findall('^X\S*: ([0-9.]+)', line)
                        if len(x) > 0:
                            print(x)
                        
                    

Үр дүн нь:

                        
                                    ['0.8475']
                                    ['0.0000']
                                    ['0.6178']
                                    ['0.0000']
                                    ['0.6961']
                                    ['0.0000']
                        
                    

Хэрэв бид дээрхтэй ижил техниĸийг ашиглан бүх revision numbers гаргаж авахыг хүсвэл дараах программыг бичиж болно.

                        
                import re
                hand = open('mbox-short.txt')
                for line in hand:
                    line = line.rstrip()
                    x = re.findall('^Details:.*rev=([0-9]+)', line)
                    if len(x) > 0:
                        print(x)
                        
                    

Тайлбарлавал:

  • ^Details: тэмдэрт: Зөвхөн Details үгээр эхэлсэн хайлтыг харуулна.
  • .* тэмдэрт: Ямарч тэмдэгтийг харуулна.
  • rev= тэмдэрт: Зөвхөн rev= үгтэй хайлтыг харуулна.
  • : тэмдэрт: Зөвхөн : тэмдэгттэй хайлтыг харуулна.
  • [0-9.]+ тэмдэрт: [0-9.] Цифр эсвэл цэгийг харуулна. + Олон давталтийг харуулна. Жишээлбэл ..9991122 хэдэнч цэг тоо харуулж болно гэсэн үг.

Үр дүн нь:

                        
                                    ['39772']
                                    ['39771']
                                    ['39770']
                                    ['39769']
                        
                    

Escape character

Escape character

Бид regular expression-д тусгай тэмдэгтүүдийг мөрийн эхлэл, төгсгөлд тааруулах эсвэл wild card- уудыг зааж өгөхийн тулд ашигладаг. Гэвч тэдгээр тэмдэгтүүдийг(жишээлбэл $, ^ гэх мэт) хайхыг хүсвэл \ урвуу зураасаар хайж болно.

Жишээ нь:

                        
                        import re
                        x = 'We just received $10.00 for cookies.'
                        y = re.findall('\$[0-9.]+',x)
                        
                    

Үр дүн нь:

                        
                            ['$10.00']