3.3 Съпоставяне

Какво да правим, след като вече сме получили обект, отговарящ на един компилиран регулярен израз? Инстанциите на RegexObject имат няколко метода и атрибута. Тук ще бъдат обсъдени само най-важните от тях. За пълния им списък се посъветвайте с Library Reference.

Метод/Атрибут  Предназначение 
match Определя дали този РИ пасва с началото на символен низ.
search Обхожда символен низ, търсейки място, което пасва с този РИ.
split Разцепва символния низ като списък, разделяйки го на местата, където пасва този РИ.
sub Намира всички места, които пасват с този РИ, и ги замества с различен символен низ.
subn Прави същото като sub(), с тази разлика, че можете да ограничите броя на заместванията.

Ако не е открито съвпадение, тези методи връщат None. Ако са преминали успешно, връща се инстанция на MatchObject, съдържаща информация за съвпадението: къде е неговото начало и край, поднизът който е паснал, и прочие.

Можете да усвоите това като експериментирате диалогово с модула re. (Ако е достъпен Tkinter, може би ще пожелаете да погледнете и redemo.py - демонстрационна програма, включена в дистрибуцията на Питон. Тя ви позволява да въвеждате РИ и символни низове, като показва дали РИ пасва или се проваля. redemo.py може да бъде много полезен, когато се опитвате да остранявате грешки от някой сложен РИ.)

Първо, стартирайте интерпретатора на Питон, импортирайте модула re, и компилирайте един РИ:

Python 1.5.1 (#6, Jul 17 1998, 20:38:08)  [GCC 2.7.2.3] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
<re.RegexObject instance at 80c3c28>
Сега вече можете да опитате да съпоставяте няколко символни низа с РИ [a-z]+. Един празен символен низ изобщо не би трябвало изобщо да пасне, тъй като + означава едно или повече повторения. В този случай match() трябва да върне None, което ще накара интерпретатора да не изведе никакъв изход. За да стане очевидно, можете изрично да изведете резултата от match().

>>> p.match( "" )
>>> print p.match( "" )
None
Сега нека опитаме върху символен низ, който би паснал, напр. "tempo". В този случай match() ще върне един MatchObject, така че ще трябва да запазите резултата в променлива за следваща употреба.

>>> m = p.match( 'tempo')
>>> print m
<re.MatchObject instance at 80c4f68>
Сега от MatchObject можете да изисквате информация за пасналия символен низ. Инстанциите на MatchObject също притежават няколко метода и атрибута. Най-важните от тях са:

Метод/Атрибут  Предназначение 
group() Връща символния низ, паснал с този РИ
start() Връща началната позиция на съвпадението
end() Връща крайната позиция на съвпадението
span() Връща комплект, съдържащ (начало, край) на съвпадението

Опитите с тези методи бързо ще изясни значението им:

>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)
group() връща подниза, паснал с този РИ. start() и end() връщат началния и крайния индекс на съвпадението. span() връща едновременно и началния и крайния индекс като комплект. Тъй като методът match проверява само дали този РИ пасва в началото на дадения символен низ, start() винаги ще бъде нула. Обаче, методът search на инстанциите на RegexObject обхожда търсейки из символния низ, така че в този случай съвпадението може да не започва от нула.

>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)
В действителните програми, най-честият подход е да се запази MatchObject в променлива, а сетне да се провери дали не е None. Това обикновено става така:

p = re.compile( ... )
m = p.match( 'тук е символния низ' )
if m:
    print 'Намерено е съвпадение: ', m.group()
else:
    print 'няма съвпадение'