Флаговете при компилация ви дават възможност да променяте някои аспекти на
начина на работа на регулярните изрази. Флаговете са достъпни в модула
re под две имена - едно дълго име като IGNORECASE, и една
кратка, еднобуквена форма като I. (Ако сте запознати с
модификаторите на образци в Perl, еднобуквените форми в Питон използват същите
букви; кратката форма на re.VERBOSE е re.X.) Могат да
бъдат указвани няколко флага чрез побитовото им ИЛИ; например, re.I |
re.M
установява едновременно флаговете I и M.
Ето една таблица на възможните флагове, последвана от по-подробно разяснение за всеки от тях.
Флаг | Значение |
---|---|
DOTALL, S | Прави така, че . да пасва с всеки символ, дори със символа за нов ред. |
IGNORECASE, I | При съпоставянето се пренебрегва разликата между малки и големи букви. |
LOCALE, L | Съпоставя, съобразявайки се с текущия локал. |
MULTILINE, M | Многоредови съпоставяния, оказва влияние върху ^ и $. |
VERBOSE, X | Позволява многословните РИ, които могат да се съставят по-ясно и разбираемо. |
>>> r = re.compile('Пещера', re.IGNORECASE) >>> print r.match('ПЕЩЕРА') None
Това ограничение е преодоляно едва при Питон 2.0, където се поддържат символни низове Unicode и модулът re предоставя допълнителен флаг за компилиране на регулярни изрази, които да работят според Unicode:
>>> r = re.compile('Пещера', re.IGNORECASE | re.UNICODE) >>> print r.match('ПЕЩЕРА') <SRE_Match object at 0x8085a10>
Обърнете внимание на допълнителният флаг UNICODE, който не е разгледан тук, но е достъпен в модула re от версиите на Питон 2.0 и следващите.
Локалите са свойство на библиотеката на C, предназначено да улесни писането на програми, които взимат предвид особеностите на езика. Например, ако обработвате български текст, ще искате да пишете \w+ за да пасвате думи, но \w пасва само с класа от символи [A-Za-z]; той няма да пасва с "ю" или "ж". Ако системата ви е настроена правилно и е избран български локал, тогава определени функции на C ще кажат на програмата, че "ю" трябва да се счита за буква. Вдигането на флага LOCALE при компилирането на един регулярен израз ще накара получения компилиран обект да използва тези функции на C за \w. Така ще става по-бавно, но все пак се дава възможност на \w+ да пасва и с български думи, както бихте очаквали.
Ето един пример, където един РИ използва re.VERBOSE. Виждате ли колко е по-лесен за четене?
charref = re.compile(r""" &\# # Започва указател за число (?P<char> [0-9]+[^0-9] # Десетична форма | 0[0-7]+[^0-7] # Осмична форма | x[0-9a-fA-F]+[^0-9a-fA-F] # Шестнадесетична форма ) """, re.VERBOSE)
charref = re.compile("&#(?P<char>[0-9]+[^0-9]" "|0[0-7]+[^0-7]" "|x[0-9a-fA-F]+[^0-9a-fA-F])")