Erisümbolite ekraniseerimine Pythoni regulaaravaldistes
Oletame, et on vaja teha nii, et erisümbol tähistaks iseennast. Selleks tuleb seda ekraniseerida kurakaldkriipsuga. Vaatame näidete varal.
Näide
Järgmises näites soovis regulaaravaldise autor,
et otsimustempli näeks välja selline: täht
'a', siis pluss '+', siis
täht 'x'. Siiski, autor ei
ekraniseerinud sümbolit '+' ja seetõttu
on otsimustempl tegelikult selline:
täht 'a' üks või mitu korda,
siis täht 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Koodi täitmise tulemus:
'a+x ! ! !'
Näide
Nüüd on autor ekraniseerinud plussi kurakaldkriipsuga.
Nüüd näeb otsimustempl välja nagu vaja: täht
'a', siis pluss '+', siis täht
'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Koodi täitmise tulemus:
'! ax aax aaax'
Näide
Selles näites näeb templi välja selline:
täht 'a', siis punkt '.',
siis täht 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Koodi täitmise tulemus:
'! abx azx'
Näide
Järgmises näites unustas autor ekraniseerida kaldkriipsu ja regulaaravaldisele vastasid kõik alamsõned, kuna ekraniseerimata punkt tähistab suvalist sümbolit:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Koodi täitmise tulemus:
'! ! !'
Märkus
Pange tähele, et kui te unustate punkti jaoks kurakaldkriipsu (kui see peaks tähistama iseennast) - siis võib seda isegi märkamata jääda:
res = re.sub('a.x', '!', 'a.x')
print(res) # tagastab '!', nagu me soovisimegi
Visuaalselt töötab õigesti (kuna punkt
tähistab suvalist sümbolit, sealhulgas ka
tavalist punkti '.'). Kuid kui muuta
sõnet, milles asendused toimuvad - näeme meie
viga:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # tagastab '! ! !', kuid oodati '! abx azx'
Erisümbolite ja tavaliste sümbolite loetelu
Kui ekraniseerida tavaline sümbol - ei juhtu midagi halba - see ikkagi tähistab iseennast. Erandiks on numbrid, neid ei saa ekraniseerida.
Sageli tekib kahtlus, kas antud sümbol on erisümbol. Mõned jõuavad selleni, et ekraniseerivad kõik kahtlased sümbolid ühekaupa. Siiski, see on halb komme (teeb regulaaravaldise kurakaldkriipsudega umbselt täis).
Erisümbolid on: $ ^ . * + ? \ / {} [] () |
Ei ole erisümbolid: @ : , ' " - _ = < > % # ~ `& !
Praktilised ülesanded
Antud sõne:
txt = 'a.a aba aea'
Kirjutage regulaaravaldis, mis leiab sõne
'a.a', haaramata ülejäänud.
Antud sõne:
txt = '2+3 223 2223'
Kirjutage regulaaravaldis, mis leiab sõne
'2+3', haaramata ülejäänud.
Antud sõne:
txt = '23 2+3 2++3 2+++3 345 567'
Kirjutage regulaaravaldis, mis leiab sõned
'2+3', '2++3', '2+++3',
haaramata ülejäänud (+ võib olla suvaline
kogus).
Antud sõne:
txt = '23 2+3 2++3 2+++3 445 677'
Kirjutage regulaaravaldis, mis leiab sõned
'23', '2+3', '2++3',
'2+++3', haaramata ülejäänud.
Antud sõne:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Kirjutage regulaaravaldis, mis leiab sõned
'*q+', '*qq+', '*qqq+',
haaramata ülejäänud.
Antud sõne:
txt = '[abc] {abc} abc (abc) [abc]'
Kirjutage regulaaravaldis, mis leiab sõned
ruutsulgudes ja asendab need
'!'-ga.