Флаги регулярных выражений в Python — примеры использования

Содержание

Что такое флаги регулярных выражений в Python?

Функции регулярных выражений в Python, такие как findall, finditer, search, match, Split, sub и т. д., имеют параметр flags, который принимает один или несколько флагов регулярного выражения.

Начиная с Python 3.6, флаги регулярных выражений являются экземплярами класса перечисления RegexFlag в модуле re. В следующей таблице показаны доступные флаги регулярных выражений и их значения:

Флаг Псевдоним Встроенный флаг Значение
re.ASCII re.A ?m re.ASCII относится только к шаблонам байтов. Это заставляет \w, \W,\b, \B, \d, \D и \S выполнять сопоставление только в формате ASCII вместо полного сопоставления в Юникоде.
re.DEBUG N/A N/A re.DEBUG показывает отладочную информацию скомпилированного шаблона.
re.IGNORECASE re.I ?i выполнить сопоставление без учета регистра. Это означает, что [AZ] также будет соответствовать строчным буквам.
re.LOCALE re.L ?L re.LOCALE имеет отношение только к шаблону байтов. Это делает совпадения \w, \W, \b, \B и регистрозависимыми от текущей локали. re.LOCALE несовместим с флагом re.ASCII.
re.MUTILINE re.M ?m re.MULTILINE находит совпадения ^ в начале строки и в начале каждой строки, а $ — в конце строки и в конце каждой строки.
re.DOTALL re.S ?s По умолчанию точка(.) соответствует любым символам, кроме символа новой строки. re.DOTALL делает точку(.) соответствующей всем символам, включая новую строку.
re.VERBOSE re.X ?x Флаг re.VERBOSE позволяет визуально организовать шаблон в логические разделы и добавлять комментарии.

Чтобы объединить два или более флага, вы используете оператор  | таким образом:

re. A | re.M | re.S

Использование флагов регулярных выражений в Python

Давайте рассмотрим несколько примеров использования флагов регулярных выражений в Python.

1) Пример флага re.IGNORECASE

В следующем примере функция findall() используется для сопоставления всех символов нижнего регистра из набора [az] в строке:

import re

s = 'Python is awesome'
pattern = '[a-z]+'

l = re.findall(pattern, s)
print(l)

Выход:

['ython', 'is', 'awesome']

Обратите внимание, что буква P не включена в результат, поскольку ее нет в наборе [az].

В следующем примере используется флаг re.INGORECASE:

import re

s = 'Python is awesome'
pattern = '[a-z]+'

l = re.findall(pattern, s, re.IGNORECASE)
print(l)

Выход:

['Python', 'is', 'awesome']

Несмотря на то, что шаблон соответствует только символам из набора [AZ], флаг re.IGNORECASE указывает механизму регулярных выражений также сопоставлять символы из набора [AZ].

2) Флаг re.MULTILINE

В следующем примере якорь ^ используется для сопоставления одного или нескольких символов слова в начале строки:

import re

s = '''Regex 
Flags'''

pattern ='^\w+'

l = re.findall(pattern,s)
print(l)

Выход:

['Regex']

Строка s состоит из двух строк. Как и ожидалось, ^ соответствует только началу строки.

Если вы используете флаг re.MULTILINE, ^ будет соответствовать началу каждой строки. Например:

import re

s = '''Regex 
Flags'''

pattern = '^\w+'

l = re.findall(pattern, s, re.MULTILINE)
print(l)

Выход:

['Regex', 'Flags']

3) Пример флага re.DOTALL

В этом примере шаблон точка .+ соответствует одному или нескольким символам, за исключением новой строки:

import re

s = '''Regex
Flags'''

pattern = '.+'

l = re.findall(pattern, s)
print(l)

Выход:

['Regex', 'Flags']

Если вы используете флаг re.DOTALL, .+ также будет соответствовать новой строке:

import re

s = '''Regex
Flags'''

pattern = '.+'

l = re.findall(pattern, s, re.DOTALL)
print(l)

Выход:

['Regex\nFlags']

4) re.VERBOSE

В следующем примере показано, как использовать флаг re.VERBOSE для записи шаблона в разделы с комментариями:

import re

s = 'Python 3'

pattern = r'''^(\w+) # match one or more characters at the beginning of the string
               \s*   # match zero or more spaces
             (\d+)$ # match one or more digits at the end of the string'''

l = re.findall(pattern, s, re.VERBOSE)
print(l)

Выход:

[('Python', '3')]

В этом примере флаг re.VERBOSE позволяет нам добавлять пробелы и комментарии к регулярному выражению для объяснения каждого отдельного правила.

5) re.ASCII

В следующем примере сопоставляются слова с двумя символами:

import re

s = '作法 is Pythonic in Japanese'
pattern = r'\b\w{2}\b'

l = re.findall(pattern, s)
print(l)

Выход:

['作法', 'is', 'in']

Однако если вы используете флаг re.ASCII, совпадения будут содержать только символы ASCII:

import re

s = '作法 is Pythonic in Japanese'
pattern = r'\b\w{2}\b'

l = re.findall(pattern, s, re.ASCII)
print(l)

Выход:

['is', 'in']

В этом примере слово 作法 было исключено из результирующего списка.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *