Yaliyomo
- Maneno ya kawaida: utangulizi
- Kupata taarifa tofauti kutoka kwa mifuatano tofauti kwa kutumia misemo ya kawaida
- Kutafuta mechi na vipengele vitatu
- Kubadilisha sehemu ya maandishi na maktaba ya Re
- Vikundi vya kujieleza vya kawaida ni vipi?
- Dhana ya "choyo" vinavyolingana
- Violezo Maarufu vya Kujieleza
- Hitimisho
Maneno ya kawaida ni sehemu maarufu sana ya karibu lugha yoyote ya programu. Wanakusaidia kupata taarifa unayohitaji kwa haraka. Hasa, hutumiwa wakati ni muhimu kusindika maandishi. Python inakuja na moduli maalum kwa chaguo-msingi. re, ambayo ni wajibu wa kufanya kazi na maneno ya kawaida.
Leo tutazungumza kwa undani juu ya ni nini kwa ujumla, jinsi ya kufanya kazi nao na jinsi moduli re itasaidia.
Maneno ya kawaida: utangulizi
Ni matumizi gani ya maneno ya kawaida? Karibu wote. Kwa mfano, hizi:
- Programu za wavuti zinazohitaji uthibitishaji wa maandishi. Mfano wa kawaida ni wateja wa barua pepe mtandaoni.
- Miradi mingine yoyote inayohusiana na maandishi, hifadhidata na kadhalika.
Kabla ya kuanza kuchanganua sintaksia, tunapaswa kuelewa kwa undani zaidi kanuni za msingi za utendakazi wa maktaba. re na kwa ujumla, nini ni nzuri kwa ujumla juu yake. Pia tutatoa mifano kutoka kwa mazoezi halisi, ambapo tutaelezea utaratibu wa matumizi yao. Unaweza kuunda kiolezo kama hicho, kinachofaa kwako kufanya shughuli nyingi na maandishi.
Ni kiolezo gani kwenye maktaba ya Re?
Pamoja nayo, unaweza kutafuta habari za aina anuwai, pata habari inayolingana nao, ili kufanya kazi zingine kubadilika zaidi. Na, bila shaka, kusindika data hii.
Kwa mfano, chukua kiolezo kifuatacho: s+. Inamaanisha tabia yoyote ya nafasi. Ikiwa unaongeza ishara zaidi kwake, basi hii ina maana kwamba muundo unajumuisha nafasi zaidi ya moja. Inaweza hata kulinganisha herufi za kichupo zinazoitwa nazo t+.
Kabla ya kuzitumia, unahitaji kuagiza maktaba Re. Baada ya hapo, tunatumia amri maalum ya kukusanya template. Hii inafanywa kwa hatua mbili.
>>> kuagiza tena
>>> regex = re.compile('s+')
Hasa, msimbo huu hufanya uendeshaji wa kuandaa template ambayo inaweza kutumika. kwa mfano, kutafuta nafasi (moja au zaidi).
Kupata taarifa tofauti kutoka kwa mifuatano tofauti kwa kutumia misemo ya kawaida
Tuseme tunayo tofauti iliyo na habari ifuatayo.
>>> maandishi = “””Informatics 100 za INF
213 Hisabati ya MAT
156 ENG Kiingereza»»»
Ina kozi tatu za mafunzo. Kila moja yao ina sehemu tatu - nambari, nambari na jina. Tunaona kwamba muda kati ya maneno haya ni tofauti. Nini cha kufanya ili kuvunja mstari huu kwa nambari na maneno tofauti? Kuna njia mbili za kufikia lengo hili:
- piga kazi kugawanyika tena.
- tumia kitendakazi kupasuliwa kwa regex.
Hapa kuna mfano wa kutumia syntax ya kila moja ya njia za utofauti wetu.
>>> re.split('s+', maandishi)
# au
>>> regex.split(maandishi)
Pato: ['100', 'INF', 'Sayansi ya Kompyuta', '213', 'MAT', 'Math', '156', 'ENG', 'English']
Kwa ujumla, njia zote mbili zinaweza kutumika. Lakini kwa kweli ni rahisi zaidi kutumia usemi wa kawaida badala ya kutumia kazi mara nyingi. kugawanyika tena.
Kutafuta mechi na vipengele vitatu
Wacha tuseme tunahitaji kutoa nambari tu kutoka kwa kamba. Nini kifanyike kwa hili?
re.findall()
Hapa kuna kesi ya utumiaji wa chaguo la kukokotoa findall(), ambayo, pamoja na maneno ya kawaida, hukuruhusu kutoa matukio ya nambari moja au zaidi kutoka kwa maandishi tofauti.
>>> chapisha (maandishi)
Taarifa 100 za INF
213 Hisabati ya MAT
156 ENG Kiingereza
>>> regex_num = re.compile('d+')
>>> regex_num.findall(maandishi)
['100', '213', '156']
Pamoja na alama ya d, tulitumia kiolezo kinachoonyesha thamani yoyote ya nambari iliyo katika kigezo au maandishi. Na kwa kuwa tuliongeza moja + hapo, hii ina maana kwamba angalau nambari moja lazima iwepo.
Unaweza pia kutumia * ishara kubainisha kuwa uwepo wa tarakimu hauhitajiki ili mechi ipatikane.
Lakini kwa upande wetu, kwa kuwa tulitumia +, tulitoa na findall() Uteuzi 1 au zaidi wa kidijitali wa kozi kutoka kwa maandishi. Kwa hivyo, kwa upande wetu, misemo ya kawaida hufanya kama mipangilio ya kazi.
re.search() dhidi ya re.match()
Kama unavyoweza kukisia kutoka kwa jina la chaguo za kukokotoa, la kwanza hutafuta zinazolingana katika maandishi. Swali: Kuna tofauti gani kati ya findall? Jambo ni kwamba inarudisha kitu maalum kinacholingana na muundo, na sio mlolongo mzima wa matokeo yaliyopatikana katika mfumo wa orodha, kama chaguo la kukokotoa la awali.
Kwa upande wake, kitendakazi cha re.match hufanya vivyo hivyo. Sintaksia pekee ndiyo tofauti. Template lazima iwekwe mwanzoni.
Hebu tuchukue mfano unaoonyesha hili.
>>> # tengeneza kigezo kwa maandishi
>>> text2 = «»»Informatics za INF
213 MAT Hisabati 156″»»
>>> # kusanya regex na utafute ruwaza
>>> regex_num = re.compile('d+')
>>> s = regex_num.search(text2)
>>> chapisha('Faharisi ya kwanza: ', s.start())
>>> chapisha('Faharisi ya mwisho: ', s.end())
>>> chapisha(text2[s.start():s.end()])
Fahirisi ya kwanza: 17
Kiashiria cha mwisho: 20
213
Ikiwa unataka kupata matokeo sawa kwa njia tofauti, unaweza kutumia kazi kikundi ().
Kubadilisha sehemu ya maandishi na maktaba ya Re
Ili kubadilisha maandishi, tumia chaguo la kukokotoa re.sub(). Tuseme orodha yetu ya kozi imebadilika kidogo. Tunaona kwamba baada ya kila thamani ya dijiti tuna kichupo. Kazi yetu ni kuchanganya mlolongo huu wote katika mstari mmoja. Ili kufanya hivyo, tunahitaji kubadilisha usemi s+ kupita
Maandishi asilia yalikuwa:
# tengeneza kibadilishaji na maandishi
>>> maandishi = “””100 INF t Informatics
213 MAT t Hisabati
156 ENG t Kiingereza»»»
>>> chapisha (maandishi)
100 MAELEZO Kompyuta
213 MAT Hisabati
156 ENG Kiingereza
Ili kufanya operesheni inayotaka, tulitumia mistari ifuatayo ya nambari.
# badilisha nafasi moja au zaidi na 1
>>> regex = re.compile('s+')
>>> chapisha(regex.sub(' ', maandishi))
Matokeo yake, tuna mstari mmoja.
101 Kompyuta za COM 205 Hisabati za MAT 189 ENG Kiingereza
Sasa fikiria tatizo lingine. Hatujakabiliwa na kazi ya kuweka nafasi. Ni muhimu zaidi kwetu kwamba majina yote ya kozi huanza kwenye mstari mpya. Ili kufanya hivyo, usemi mwingine hutumiwa ambao unaongeza laini mpya kwa ubaguzi. Huu ni usemi wa aina gani?
maktaba Re inasaidia kipengele kama vile ulinganishaji hasi. Inatofautiana na ile ya moja kwa moja kwa kuwa ina alama ya mshangao kabla ya kufyeka. Hiyo ni, ikiwa tunahitaji kuruka herufi mpya, basi tunahitaji kuandika !n badala ya n.
Tunapata nambari ifuatayo.
# ondoa nafasi zote isipokuwa laini mpya
>>> regex = re.compile('((?!n)s+)')
>>> chapisha(regex.sub(' ', maandishi))
Taarifa 100 za INF
213 Hisabati ya MAT
156 ENG Kiingereza
Vikundi vya kujieleza vya kawaida ni vipi?
Kwa msaada wa makundi ya maneno ya kawaida, tunaweza kupata vitu vinavyohitajika kwa namna ya vipengele tofauti, na si kwa mstari mmoja.
Tuseme tunahitaji kupata nambari ya kozi, nambari na jina sio kwenye mstari mmoja, lakini kama vitu tofauti. Ili kukamilisha kazi, utahitaji kuandika idadi kubwa ya mistari isiyo ya lazima ya nambari.
Kwa kweli, kazi inaweza kurahisishwa sana. Unaweza kukusanya kiolezo cha maingizo yote na ueleze tu data unayohitaji kupata kutoka kwa mabano.
Kutakuwa na idadi ndogo sana ya mistari.
# tengeneza vikundi vya templeti za maandishi na uzitoe
>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'
>>> pata tena(muundo wa_kozi, maandishi)
[('100', 'INF', 'Sayansi ya Kompyuta'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]
Dhana ya "choyo" vinavyolingana
Kwa kawaida, misemo ya kawaida imepangwa ili kutoa kiwango cha juu cha data inayolingana. Na hata ikiwa unahitaji kidogo zaidi.
Hebu tuangalie sampuli ya msimbo wa HTML ambapo tunahitaji kupata lebo.
>>> maandishi = "Mfano wa Ulinganishaji wa Maonyesho ya Mara kwa Mara ya Uchoyo"
>>> re.findall('', maandishi)
['Mfano wa Ulinganifu wa Mara kwa Mara wa Uchoyo']
Badala ya kutoa lebo moja tu, Python alipata kamba nzima. Ndiyo maana inaitwa pupa.
Na nini cha kufanya ili kupata lebo tu? Katika kesi hii, unahitaji kutumia uvivu unaofanana. Ili kutaja usemi kama huo, alama ya swali huongezwa hadi mwisho wa muundo.
Utapata nambari ifuatayo na matokeo ya mkalimani.
>>> re.findall('', maandishi)
[", ”]
Ikiwa inatakiwa kupata tu tukio la kwanza lililokutana, basi njia hutumiwa tafuta ().
tafuta upya('', text).group()
"
Kisha tu tag ya ufunguzi itapatikana.
Violezo Maarufu vya Kujieleza
Hapa kuna jedwali lililo na mifumo ya usemi inayotumika sana.
Hitimisho
Tumezingatia njia za msingi tu za kufanya kazi na misemo ya kawaida. Kwa hali yoyote, umeona jinsi wao ni muhimu. Na hapa haifanyi tofauti ikiwa ni muhimu kuchanganua maandishi yote au vipande vyake vya kibinafsi, ikiwa ni muhimu kuchambua chapisho kwenye mtandao wa kijamii au kukusanya data ili kuishughulikia baadaye. Maneno ya kawaida ni msaidizi wa kuaminika katika suala hili.
Wanakuruhusu kufanya kazi kama vile:
- Inabainisha umbizo la data, kama vile anwani ya barua pepe au nambari ya simu.
- Kupata kamba na kuigawanya katika nyuzi kadhaa ndogo.
- Tekeleza utendakazi mbalimbali kwa maandishi, kama vile kutafuta, kutoa taarifa muhimu, au kubadilisha sehemu ya wahusika.
Maneno ya kawaida pia hukuruhusu kufanya shughuli zisizo za kawaida. Kwa mtazamo wa kwanza, kusimamia sayansi hii si rahisi. Lakini katika mazoezi, kila kitu ni sanifu, kwa hivyo inatosha kuhesabu mara moja, baada ya hapo chombo hiki kinaweza kutumika sio tu kwenye Python, bali pia katika lugha nyingine yoyote ya programu. Hata Excel hutumia misemo ya kawaida kuhariri usindikaji wa data. Kwa hivyo ni dhambi kutotumia zana hii.