Както казахме по-рано, в регулярните изрази се използва обратно наклонена черта ("\"), за да се обозначат някакви извънредни форми, или за да се позволи употребата на специални символи без да се извиква тяхното специално значение. Възниква противоречие, тъй като същият символ в низовете на Питон служи за същото.
Да речем, че желаете да напишете един РИ, който да пасва със символния низ
"\section", намиращ се в LATEX файл. За да разберете какво да
напишете в програмния код, започнете с желания символен низ, който трябва да
пасне. След това, всички обратно наклонени черти или други метасимволи трябва
да бъдат избегнати, като пред тях се сложи обратно наклонена черта. В резултат
на това се получава символния низ "\\section". Полученият символен
низ, който трябва да бъде подаден на re.compile(), е
\\section
. Но за да изразите това като символен низ в Питон и двете
обратно наклонени черти трябва да бъдат избегнати още веднъж.
Символи | Фаза |
---|---|
\section |
Текст, който трябва да пасне |
\\section |
Избегната обратно наклонена черта за re.compile |
"\\\\section" |
Избегнати обратно наклонени черти за символния низ в Питон |
Накратко, за да съвпаднете буквално една обратно наклонена черта, трябва да
напишете '\\\\'
в символния низ на РИ, понеже регулярният израз
трябва да бъде "\\", и всяка обратно наклонена черта трябва да бъде
изразена като "\\" в рамките на един обикновен символен низ на Питон.
В такива РИ, които включват няколко обратно наклонени черти, това води до
толкова много повторени черти, че силно се затруднява разбирането на
получените символни низове.
Решението е да се използва нотацията за сурови символни низове на Питон.
Обратно налконените черти не се третират по никакъв специален начин в символни
низове, предходени от "r". Така че r"\n"
е двусимволен низ,
съдържащ "\" и "n", докато "\n"
е едносимволен
низ, съдържащ символ за нов ред. Често регулярните изрази в кода на Питон ще
бъдат изразявани чрез тази нотация за сурови символни низове.
Обикновен символен низ | Суров символен низ |
---|---|
"ab*" |
r"ab*" |
"\\\\section" |
r"\\section" |
"\\w+\\s+\\1" |
r"\w+\s+\1" |