Друга често срещана задача е да се открият всички съвпадения с даден образец и
после да се заместят с друг символен низ. Методът sub() приема като
аргументи една стойност, която ще служи за заместител (тя може да бъде или
символен низ или функция) и символен низ, който трябва да бъде обработен. Тъй
като символните низове в Питон са непроменливи, тази функция на практика ще
върне нов символен низ.
- sub(replacement, string[, count
= 0
])
-
Връща символния низ, получен чрез заместване на най-левите не-припокриващи
се срещания на РИ в string със заместителя replacement. Ако
образецът не се среща изобщо, string се връща непокътнат.
Незадължителният аргумент count задава максималния брой на срещанията
на образеца, които трябва да бъдат заместени; count трябва да бъде
неотрицателно цяло число. Стойността по подразбиране е 0, която значи да се
заместят всички срещания.
Ето един прост пример за използване на метода sub():
>>> p = re.compile( '(blue|white|red)')
>>> p.sub( 'colour', 'blue socks and red shoes')
'colour socks and colour shoes'
>>> p.sub( 'colour', 'blue socks and red shoes', 1)
'colour socks and red shoes'
Празните съвпадения се заместват само когато не са в съседство с предишно
съвпадение.
>>> p = re.compile('x*')
>>> p.sub('-', 'abxd')
'-a-b-d-'
Ако replacement е символен низ, всички специални последователности с
обратно наклонени черти в него се обработват. Например, "\n" се
превръща в символ за нов ред, "\r" се превръща в символ за връщане на
каретката и т.н. Не се обработват непознатите последователности като "\
j". Отпратките като "\6" се заместват с частта от символния низ,
която е паснала на съответната група от РИ. Това ви дава възможност да
включвате части от оригиналния текст в получения символен низ, използван като
заместител.
>>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First} section{second}')
'subsection{First} subsection{second}'
В допълнение към специалните символни послеодвателности и отпратките, описани
по-горе, "\g<име>" ще използва символния низ, паснал с групата на име
"име", според определението на синтаксиса (?P<име>...).
"\g<номер>" използва съответния номер на група. Следователно,
"\g<2>" е еквивалент на "\2", но няма двусмислие в символни
низове като "\g<2>0". ("\20" ще бъде изтълкуван като отпратка
към група 20, а не като отпратка към група 2, последвана от буквалния символ
"0".) Следващите замествания са еквивалентни, но всяко от тях
използва различен вариант на заместващия символен низ:
>>> p = re.compile('section{ (?P<name> [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First}')
'subsection{First}'
>>> p.sub(r'subsection{\g<1>}','section{First}')
'subsection{First}'
>>> p.sub(r'subsection{\g<name>}','section{First}')
'subsection{First}'
replacement може да бъде и функция, а това дава възможност за още
по-мощно управление. Ако replacement е функция, тя се извиква за всяко
не-припокриващо се срещане на образеца, като и се подава аргумент
MatchObject. Функцията може да използва тази информация за да изчисли
желания заместващ символен низ и да го върне като резултат. Например:
>>> def hexrepl( match ):
... "Връща шестнадесетично представяне на десетично число."
... value = int( match.group() )
... return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'
Когато използвате функцията re.sub() на ниво модул, образецът се
подава като първи аргумент. Образецът може да бъде символен низ или
RegexObject. Ако трябва да посочите флагове за регулярния израз,
трябва или да сложите RegexObject като първи параметър, или да
използвате вградени в образеца модификатори, напр. sub("(?i)b+", "x",
"bbbb BBBB")
връща 'x x'
.