Регулярните изрази се използват за търсене и заместване в текст. Те предлагат апарат, с който дефинирате шаблони, описващи последователност от символи, след което да проверявате дали даден текст съдържа съответния шаблон. Основават се на идея от дискретната математика, макар че реализацията им в езиците за програмиране е доста по-сложна.
pam
съответстват spam
и pamela
h(ot|ound) dog
съответстват hot dog
и hound dog
fn\d+
съответстват fn1
, fn44444
, fn420169
и т.н..at
съответстват hat
, cat
, rat
и т.н.[a-zA-Z0-9._]+@[a-aA-Z0-9._]+\.[a-z]+
съответстват повечете email адреси\d
съответства на цифра\w
съответства на буква\s
съответства на бяло пространство\D
, \W
и \S
са инверсии на съответните символи\d\d\d\d\d\d\d
съответства на ЕГН\w\w\w\d\w\w\d\d
съответства на три букви, цифра, две букви и после две цифри (например ani4ka92
)fn\d\d\d\d\d
съответства на част от факултетните номераM\w\w\w\w\sT\w\w\sP\w\w\w\w\w
би хванало Mityo The Python
s..m
съответства на spam
и sram
В Python се ползва модулът re
import re
>>> import re
>>> re.search('spam', 'gmail')
>>> re.search('s..m', 'spam')
<_sre.SRE_Match object at 0x00A31090>
>>> re.search('\\d\\d', 'asnwer: 42')
<_sre.SRE_Match object at 0x00A310C8>
|
в регулярните изрази означава това отляво или това отдясно(c|h)at
намира cat
и hat
^
съвпада с началото на низа. ^oo
ще намери oop
, но не и foo
.$
съвпада с края на низа. ar$
ще намери bar
, но не и argh
.?
означава, че да го има 0 или 1 пъти+
означава, че нещо може да го има един или повече пъти*
означава, че нещо може да го има нула или много пъти{x, y}
означава, че нещо може да го има от x
до y
пъти\d{8} fn\d+ \d{1,2}\.\d{1,2}.\d{4} route\d*
[]
.[chr]at
съответства на cat
, hat
и rat
.[a-z0-8]
съответства на малка буква или цифра, без 9^
, класът се интерпретира като отрицание на символите
вътре - [^A-Z]
съответства на нещо, което не е голяма буква
Върнатия от search
обект има методи start
, end
и span
.
>>> import re
>>> text = 'Bla bla bla mityo blabla bla'
>>> match = re.search(r'mityo', text)
>>> match.span()
(12, 17)
>>> match.start(), match.end()
12, 17
>>> text[match.start(), match.end()]
'mityo'
Всички изрази оградени със скоби се запазват в обекта върнат от re.search. Те се наричат групи
>>> import re
>>> match = re.search(r'\w+ (\w+), fn(\d+)',
'Nickolay Bachiiski, fn43600')
>>> match.group(1)
'Bachiiski'
>>> match.group(2)
'43600'
Всички изрази оградени със скоби се запазват в обекта върнат от re.search. Те се наричат групи
>>> import re
>>> re.sub(r':(.*)!', r'!\1?', "I'm a :very big! hacker!")
"I'm a !very big hacker?"
+
, *
и {x,y}
намират
максималния брой символи, които могат. Това се нарича "алчно поведение"
(greedy). Ако искате да намирате минималния брой, добавете едно ? към края
>>> import re
>>> re.sub(r'<b>(.*)</b>', r'<strong>\1</strong>',
'My name is <b>Mityo</b> the <b>Python</b>')
'My name is <strong>Mityo</b> the <b>Python</strong>'
>>> re.sub(r'<b>(.*?)</b>', r'<strong>\1</strong>',
'My name is <b>Mityo</b> the <b>Python</b>')
'My name is <strong>Mityo</strong> the <b>Python</b>'