„ Програмиране с Python“, ФМИ
28.02.2007г.
Идеята
Регулярните изрази се използват за търсене и заместване в текст. Те предлагат апарат, с който дефинирате шаблони, описващи последователност от символи, след което да проверявате дали даден текст съдържа съответния шаблон. Основават се на идея от дискретната математика, макар че реализацията им в езиците за програмиране е доста по-сложна.
Прост пример
- на
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са инверсии на съответните символи
В детайли (2)
\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 Pythons..mсъответства наspamиsram
В Python
В Python се ползва модулът re
import re
>>> import re
>>> re.search('spam', 'gmail')
>>> re.search('s..m', 'spam')
<_sre.sre_match>
>>> re.search('\\d\\d', 'asnwer: 42')
<_sre.sre_match>
Още детайли
- Операторът
|в регулярните изрази означава това отляво или това отдясно (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'(.*)', r'\1',
'My name is Mityo the Python')
'My name is Mityo the Python'
>>> re.sub(r'(.*?)', r'\1',
'My name is Mityo the Python')
'My name is Mityo the Python'
Няма коментари:
Публикуване на коментар