Флаги регулярных выражений в Python — примеры использования
- Что такое флаги регулярных выражений в Python?
- Использование флагов регулярных выражений в Python
- 1) Пример флага re.IGNORECASE
- 2) Флаг re.MULTILINE
- 3) Пример флага re.DOTALL
- 4) re.VERBOSE
- 5) re.ASCII
Что такое флаги регулярных выражений в 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']
В этом примере слово 作法 было исключено из результирующего списка.