Флаги, используемые в функции re.compile()
Флаги, используемые для компиляции регулярного выражения
Второй аргумент флаг flag в функции re.compile() может принимать следующие значения:
Содержание:
- Флаг re.ASCII() ,
- Флаг re.DEBUG ,
- Флаг re.IGNORECASE() ,
- Флаг re.LOCALE() ,
- Флаг re.MULTILINE() ,
- Флаг re.DOTALL() ,
- Флаг re.VERBOSE() ,
re.A ,
re.ASCII :
Флаг re.A или re.ASCII заставляет \w , \W , \b , \B , \d , \D , \s и \S выполнить только ASCII соответствие вместо полного соответствия Unicode. Имеет значение только для шаблонов строк Юникода и игнорируется для шаблонов байтов. Соответствует встроенному флагу (?a) .
Обратите внимание, что для обратной совместимости флаг re.U все еще существует, как и его синоним re.UNICODE и его встроенный аналог (?u) , но они избыточны в Python 3. По умолчанию совпадения являются строками Unicode, а для байтов совпадение Unicode не допускается.
re.DEBUG :
Флаг re.DEBUG показывает отладочную информацию о скомпилированном выражении. Соответствующего встроенного флага НЕТ.
re.I ,
re.IGNORECASE :
Флаг re.I или re.IGNORECASE выполняет сопоставление без учета регистра. Выражения типа [A-Z] также будут соответствовать строчным буквам. Обеспечивает полное соответствие кодировке Unicode (т.е. Й будет сопоставляться с й ), если только не используется флаг re.ASCII . Текущий языковой стандарт не изменяет действие этого флага, если только не используется флаг re.LOCALE . Соответствует встроенному флагу (?i) .
Обратите внимание, что когда шаблоны Unicode [a-z] или [A-Z] используются в сочетании с флагом IGNORECASE , они будут соответствовать 52 буквам ASCII и 4 дополнительным не-ASCII буквам: ‘İ’ — U+0130, Латинская заглавная буква ‘I’ с точкой выше, ‘ı’ — U+0131, Латинская маленькая буква без точки ‘i’ , ‘ſ’ — U+017F, Латинская маленькая буква long s) и ‘K’ — U+212A, знак Кельвина. Если используется флаг re.ASCII , то совпадают только буквы a — z и A — Z .
re.L ,
re.LOCALE :
Флаг re.L или re.LOCALE делает сопоставление \w , \W , \b , \B и без учета регистра, зависимым от текущей локали. Этот флаг может использоваться только с шаблонами байтов. Использование этого флага не рекомендуется, так как механизм локализации очень ненадежен и он работает только с 8-битными локалями. Сопоставление Юникода уже включено по умолчанию в Python 3 для шаблонов строк Unicode и способно обрабатывать различные языки/локали. Соответствует встроенному флагу (?L) .
- Флаг re.LOCALE может использоваться только с байтовыми шаблонами и не совместим с флагом re.ASCII .
- Флаг re.LOCALE не зависит от локали во время компиляции и влияет на результат сопоставления только в момент сопоставления.
re.M ,
re.MULTILINE :
- символ шаблоне ‘^’ в шаблоне совпадает с позицией начала строки и с позицией начала каждой строки, сразу после каждой новой строки.
- символ шаблона ‘$’ совпадает с позицией конца строки и с позицией конца каждой строки, непосредственно перед каждой новой строкой.
По умолчанию ‘^’ совпадает только с позицией начала строки, а ‘$’ только с позицией конца строки и непосредственно перед новой строкой (если есть) в конце строки. Флаг re.MULTILINE соответствует встроенному флагу (?m) .
re.S ,
re.DOTALL :
Флаг re.S или re.DOTALL делает так, что бы специальный символ ‘.’ — точка соответствовал любому символу вообще, включая новую строку ‘\n’ . Без этого флага, специальный символ ‘.’ — точка будет соответствовать чему угодно, кроме новой строки. Флаг re.DOTALL соответствует встроенному флагу (?s) .
re.X ,
re.VERBOSE :
Флаг re.X или re.VERBOSE позволяет писать регулярные выражения, которые выглядят лучше и удобнее для чтения, позволяя визуально разделять логические разделы шаблона и добавлять комментарии. Пробельные символы в шаблоне игнорируются, за исключением случаев, когда они находятся в символьном классе или когда им предшествует неэкранированная обратная косая черта, или внутри токенов, таких как *? , (?: или (?P <. >. Если строка содержит символ # , который не входит в символьный класс и которому не предшествует неэкранированная обратная косая черта, то все символы от крайнего левого положения символа # до конца строки игнорируются.
Это означает, что два следующих объекта регулярного выражения, которые соответствуют десятичному числу, функционально равны:
a = re.compile(r"""\d + # the integral part \. # the decimal point \d * # some fractional digits""", re.X) b = re.compile(r"\d+\.\d*")
Флаг re.VERBOSE соответствует встроенному флагу (?x) .
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Синтаксис регулярных выражений
- Функция compile() модуля re
- Флаги, используемые в функции re.compile()
- Функция search() модуля re
- Функция match() модуля re
- Функция fullmatch() модуля re
- Функция finditer() модуля re
- Функция split() модуля re
- Функция findall() модуля re
- Функция sub() модуля re
- Функция subn() модуля re
- Функция escape() модуля re
- Функция purge() модуля re
- Исключение error() модуля re
- Объект регулярного выражения Pattern модуля re
- Объект совпадения с шаблоном Match модуля re
Переменные-флаги
В старые времена с помощью флагов командовали войсками. Например, если флаг поднят — нужно атаковать, опущен — отступать.
В программировании “флагом” называют переменную булевого типа, т.е. в которой хранится либо True , либо False . Их так называют потому, что управление с их помощью похоже на флаги: есть всего 2 варианта, флаг или поднят, или опущен.
Например, вам интересно, есть ли человек на видео. Вы пишете функцию, которая проходит по кадрам видео и проверяет каждый из них. Если найдёт человека, то сообщит об этом:
def check_human_in_video(video): human_found = False for frame in video: if frame.has_human(): human_found = True print(human_found)
Обратите внимание, что True и False написаны без кавычек! Так и задумано — это не строки, а отдельный тип данных.
По умолчанию считаем, что человека нет, поэтому создаём флаг human_found = False . Далее для каждого кадра в видео проверяем, есть ли на нём человек — вызываем метод объекта frame.has_human() . Если человек найден, то меняем флаг на True . В конце выводим флаг с помощью print .
Если ни на одном кадре человек не найдётся, то флаг так и останется False , потому что условие if frame.has_human() ни разу не сработает.
Если хоть на одном кадре есть человек, то при обработке этого кадра сработает условие if frame.has_human() и флаг станет True .
Как улучшить код
Теперь усовершенствуем код. Функция станет удобнее, если откажется от вывода на экран в пользу return .
def is_human_in_video(video): human_found = False for frame in video: if frame.has_human(): human_found = True return human_found print(is_human_in_video(video))
Следующим шагом ускорим работу функции. Сейчас код продолжит проверку, даже если встретит человека на самом первом кадре видео. Если кадров в video будет много, то проверка займёт время. Это даёт возможность для оптимизации. Прервём проверку сразу, как только станет ясен результат:
def is_human_in_video(video): human_found = False for frame in video: if frame.has_human(): human_found = True return human_found return human_found print(is_human_in_video(video))
Теперь заметно, что от переменной human_found можно избавиться, сделав код немного лаконичнее:
def is_human_in_video(video): for frame in video: if frame.has_human(): return True return False print(is_human_in_video(video))
Но и это ещё не всё. Флаги являются таким частым приёмом, что они попали в стандартную библиотеку Python. Код выше можно записать в одну строку:
def is_human_in_video(video): return any(frame.has_human() for frame in video)
- Про функцию any
- Что такое list comprehension?
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Флаги шаблона регулярного выражения Python
Флаги объекта регулярного выражения позволяют изменить некоторые аспекты работы регулярных выражений. Флаги доступны при компиляции шаблона регулярного выражения модуля re под двумя именами: длинное имя, например, re.IGNORECASE и короткая однобуквенная форма, например re.I . Несколько флагов в функции компиляции re.compile() могут быть заданы побитовым ИЛИ, например re.I | re.M .
re.I ,
re.IGNORECASE :
Флаг re.IGNORECASE выполняет сопоставление без учета регистра. Класс символов и буквенные строки будут соответствовать буквам, игнорируя регистр. Например шаблону [A-Z] тоже будут соответствовать строчные буквы. То есть строка ‘Spam’ будет соответствовать ‘Spam’ , ‘spam’ или ‘spAM’ . Этот флаг не учитывает текущую локаль, но локаль будет учитываться, если также установите флаг re.LOCALE .
re.L ,
re.LOCALE :
Флаг re.LOCALE делает метасимволы \w , \W , \b и \B зависимыми от текущей локали, а не от базы данных Unicode.
Локали — это функция библиотеки языка C , предназначенная для написания программ, учитывающих языковые различия. Например, если обрабатывается текст на русском языке, то необходимо иметь возможность чтобы \w+ соответствовало словам, но \w соответствует только классу символов [A-Za-z] и не будет соответствовать й или «ё». Если система настроена правильно и выбран русский язык, некоторые функции языка C сообщат программе, что й также следует считать буквой. Установка флага re.LOCALE при компиляции регулярного выражения приведет к тому, что результирующий скомпилированный объект будет использовать эти функции C для \w . Компиляция будет происходить медленнее, но также позволяет \w+ сопоставлять русские слова, как и ожидается.
re.M ,
re.MULTILINE :
Об обозначении и использовании метасимволов ‘^’ и ‘$’ смотрите в разделе «Дополнительные метасимволы»
Обычно метасимвол ‘^’ совпадает только с началом строки, а ‘$’ совпадает только с концом строки и непосредственно перед новой строкой, если таковая имеется в конце строки. Когда задан флаг re.MULTILINE , ‘^’ совпадает в начале строки и в начале каждой строки в строке, сразу после каждой новой строки. Аналогично метасимвол ‘$’ совпадает либо в конце строки, либо в конце каждой строки, непосредственно перед каждой новой строкой.
re.NOFLAG :
Указывает, что флаг не применяется, значение равно 0. Этот флаг может использоваться как значение по умолчанию для ключевого аргумента функции или как базовое значение, которое будет условно объединено с другими флагами. Пример использования в качестве значения по умолчанию:
def myfunc(text, flag=re.NOFLAG): return re.match(text, flag)
Новое в Python 3.11.
re.S ,
re.DOTALL :
Флаг re.DOTALL заставляет специальный символ ‘.’ соответствовать любому символу вообще, включая перевод строки ‘\n’ . Без этого флага ‘.’ будет соответствовать все, кроме новой строки.
re.A ,
re.ASCII :
Флаг re.ASCII заставляет \w , \W , \b , \B , \s и \S выполнять только ASCII-сопоставление вместо полного соответствия Unicode. Это имеет значение только для шаблонов Юникода и игнорируется для шаблонов байтов.
re.X ,
re.VERBOSE :
Флаг re.VERBOSE позволяет писать регулярные выражения, которые будут более читабельными, предоставляя больше гибкости в оформлении и форматировании. Когда флаг указан, пробел в строке регулярного выражения игнорируется, за исключением случаев, когда этот пробел находится в классе символов или ему предшествует не экранированный обратный слеш. Это позволяет более четко организовать отступы в шаблонах RegExp. Флаг re.VERBOSE также позволяет помещать комментарии в шаблоны с RegExp, которые будут игнорироваться движком. Комментарии помечаются символом ‘#’ .
Пример шаблона с регулярным выражением, которое использует флаг re.VERBOSE :
charref = re.compile(r""" &[#] # Start of a numeric entity reference ( 0[0-7]+ # Octal form | [0-9]+ # Decimal form | x[0-9a-fA-F]+ # Hexadecimal form ) ; # Trailing semicolon """, re.VERBOSE)
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Символьные классы и сокращенные обозначения классов
- Повторение набора символов в регулярном выражении
- Компиляция регулярных выражений
- Обратный слеш в регулярных выражениях Python
- Методы скомпилированного регулярного выражения
- Функции уровня модуля re
- Флаги объекта регулярного выражения
- Метасимволы нулевой ширины в RegExp Python
- Группы с захватом в регулярных выражениях Python
- Обратные ссылки регулярного выражения
- Именованные группы регулярных выражениях Python
- Группы без захвата в регулярных выражениях
- Опережающая и ретроспективная проверка позиции в RegExp
- Деление строки по регулярному выражению
- Поиск и замена по регулярному выражению
- match() VS search()
- Жадный квантификатор против не жадного
Флаги
В предыдущем примере программа выполняла некоторые операции, пока заданное условие оставалось истинным. А что если вы пишете более сложную программу, выполнение которой может прерываться по нескольким разным условиям?
Например, компьютерная игра может завершаться по разным причинам: у игрока кончились все «жизни»; прошло отведенное время; все города, которые он должен был защищать, были уничтожены и т.д. Игра должна завершаться при выполнении любого из этих условий. Попытки проверять все возможные условия в одной команде while быстро усложняются и становятся слишком громоздкими.
Если программа должна выполняться только при истинности нескольких условий, определите одну переменную-флаг. Эта переменная сообщает, должна ли программа выполняться далее. Программу можно написать так, чтобы она продолжала выполнение, если флаг находится в состоянии True, и завершалась, если любое из нескольких событий перевело флаг в состояние False. В результате в команде while достаточно проверить всего одно условие: находится ли флаг в состоянии True. Все остальные проверки (которые должны определить, произошло ли событие, переводящее флаг в состояние False) удобно организуются в остальном коде.
Добавим флаг в программу parrot.py из предыдущего раздела. Этот флаг, который мы назовем active (хотя переменная может называться как угодно), управляет тем, должно ли продолжаться выполнение программы:
prompt = » Tell me something, and I will repeat it back to you:»
prompt += » Enter ‘quit’ to end the program. «
(3) . .if message == ‘quit’:
В точке (1) переменной active присваивается True, чтобы программа начинала работу в активном состоянии. Это присваивание упрощает команду while, потому что в самой команде while никакие сравнения не выполняются; вся логика реализуется в других частях программы. Пока переменная active остается равной True, цикл выполняется.
В команде if внутри цикла while значение message проверяется после того, как пользователь введет данные. Если пользователь ввел строку ‘quit’ (3), флаг active переходит в состояние False, а цикл while останавливается. Если пользователь ввел любой текст, кроме ‘quit’ (4), то введенные им данные выводятся как сообщение.
Результаты работы этой программы ничем не отличаются от предыдущего примера, в котором условная проверка выполняется прямо в команде while. Но теперь в программе имеется флаг, указывающий, находится ли она в активном состоянии, и вы сможете легко добавить новые проверки (в форме команд elif) для событий, с которыми переменная active может перейти в состояние False. Это может быть удобно в сложных программах — например, в компьютерных играх с многочисленными событиями, каждое из которых может привести к завершению программы. Когда по любому из этих событий флаг active переходит в состояние False, основной игровой цикл прервется, выводится сообщение о завершении игры, и у игрока появляется возможность сыграть еще раз.
