Specialiųjų simbolių ekranavimas Python reguliariosiose išraiškose
Tarkime, kad reikia pasidaryti taip, kad specialusis simbolis reikštų pats save. Tam jis turi būti ekranuotas naudojant atgalinį brūkšnį. Pažiūrėkime pavyzdžiais.
Pavyzdys
Šiame pavyzdyje reguliariosios išraiškos autorius norėjo,
kad paieškos šablonas atrodytų taip: raidė
'a', tada pliusas '+', tada
raidė 'x'. Tačiau, kodo autorius
neekranavo simbolio '+' ir todėl
paieškos šablonas iš tikrųjų atrodo taip:
raidė 'a' vieną ar daugiau kartų,
paskui raidė 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Kodo vykdymo rezultatas:
'a+x ! ! !'
Pavyzdys
Dabar autorius ekranavo pliusą atgaliniu
brūkšniu. Dabar paieškos šablonas atrodo taip,
kaip reikia: raidė 'a', tada pliusas
'+', tada raidė 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Kodo vykdymo rezultatas:
'! ax aax aaax'
Pavyzdys
Šiame pavyzdyje šablonas atrodo taip:
raidė 'a', tada taškas '.',
tada raidė 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Kodo vykdymo rezultatas:
'! abx azx'
Pavyzdys
Šiame pavyzdyje autorius pamiršo ekranuoti brūkšnį ir pagal reguliariąją išraišką pateko visos eilutės, nes neekranuotas taškas reiškia bet kurį simbolį:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Kodo vykdymo rezultatas:
'! ! !'
Pastaba
Atkreipkite dėmesį į tai, kad jei jūs pamiršite atgalinį brūkšnį taškui (kai jis turėtų reikšti pats save) - to galbūt net nepastebėsite:
res = re.sub('a.x', '!', 'a.x')
print(res) # grąžins '!', kaip ir norėjome
Vizualiai veikia teisingai (kadangi taškas
reiškia bet kurį simbolį, taip pat ir
įprastą tašką '.'). Bet jei pakeisime
eilutę, kurioje vyksta pakeitimai - mes
pamatysime savo klaidą:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # grąžins '! ! !', o tikėtasi '! abx azx'
Specialiųjų ir įprastų simbolių sąrašas
Jei ekranuosite įprastą simbolį - nieko baisaus neatsitiks - jis vis tiek reikš pats save. Išimtis - skaičiai, jų negalima ekranuoti.
Dažnai kyla abejonių, ar tam tikras simbolis yra specialusis. Kai kurie pradeda ekranuoti visus įtartinus simbolius iš eilės. Tačiau, tai yra bloga praktika (teršia reguliariąsias išraiškas atgaliniais brūkšniais).
Yra specialieji simboliai: $ ^ . * + ? \ / {} [] () |
Nėra specialieji simboliai: @ : , ' " - _ = < > % # ~ `& !
Praktinės užduotys
Duota eilutė:
txt = 'a.a aba aea'
Parašykite reguliariąją išraišką, kuri ras eilutę
'a.a', neperimdama kitų.
Duota eilutė:
txt = '2+3 223 2223'
Parašykite reguliariąją išraišką, kuri ras eilutę
'2+3', neperimdama kitų.
Duota eilutė:
txt = '23 2+3 2++3 2+++3 345 567'
Parašykite reguliariąją išraišką, kuri ras eilutes
'2+3', '2++3', '2+++3',
neperimdama kitų (+ gali būti bet koks
kiekis).
Duota eilutė:
txt = '23 2+3 2++3 2+++3 445 677'
Parašykite reguliariąją išraišką, kuri ras eilutes
'23', '2+3', '2++3',
'2+++3', neperimdama kitų.
Duota eilutė:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Parašykite reguliariąją išraišką, kuri ras eilutes
'*q+', '*qq+', '*qqq+',
neperimdama kitų.
Duota eilutė:
txt = '[abc] {abc} abc (abc) [abc]'
Parašykite reguliariąją išraišką, kuri ras eilutes
kvadratiniuose skliaustuose ir pakeis jas
'!'.