Сцягі для радкоў рэгулярак у Python

Каб задаць сцягі як адзін з неабавязковых параметраў для метадаў, якія працуюць з рэгуляркамі, выкарыстоўваюць наступны сінтаксіс:

pythonflags=re.імя сцяга

Асноўныя сцягі для працы з рэгуляркамі

Сцяг Прызначэнне
re.IGNORECASE Ігнараванне рэгістру напісання сімвалаў.
re.DOTALL Кропка абазначае любы сімвал, уключаючы і перанос радка.
re.I Робіць пошук неадчувальным да рэгістру.
re.L Шукае словы ў адпаведнасці з бягучым мовай. Гэтая інтэрпрэтацыя закранае алфавітную групу (\w і \W), а таксама паводзіны мяжы слова (\b і \B).
re.M Сімвал $ выконвае пошук у канцы любога радка тэксту (не толькі канцы тэксту) і сімвал ^ выконвае пошук у пачатку любога радка тэксту (не толькі ў пачатку тэксту).
re.S Змяняе значэнне кропкі (.) на супадзенне з любым сімвалам, уключаючы новы радок.
re.U Інтэрпрэтуе літары ў адпаведнасці з наборам сімвалаў Unicode. Гэты сцяг уплывае на паводзіны \w, \W, \b, \B. У Python 3+ гэты сцяг усталяваны па змаўчанні.
re.X Дазваляе шматрадковы сінтаксіс рэгулярнага выразу. Ён ігнаруе прабелы ўнутры шаблону (за выключэннем прабелаў унутры набору [] або пры экранаванні адваротным слешам) і апрацоўвае не экранаваны '#' як каментарый.

Прыклад

З дапамогай сцяга re.IGNORECASE можна ігнараваць рэгістр сімвалаў. Давайце паглядзім, як гэта робіцца. У гэтым прыкладзе рэгулярка знойдзе толькі маленькія літары:

pythontxt = 'aaa bbb CCC DDD'
res = re.sub('[a-z]+', '!', txt)

print(res)

Вынік выканання кода:

python'! ! CCC DDD'

Прыклад

А цяпер дадамо ў чацвёрты параметр метада сцяг re.IGNORECASE і рэгулярка пачне шукаць сімвалы ва ўсіх рэгістрах:

pythontxt = 'aaa AAA bbb BBB'
res = re.sub('[a-z]+', '!', txt, flags=re.IGNORECASE)

print(res)

Вынік выканання кода:

python'! ! ! !'

Прыклад

Давайце знойдзем рэгуляркай усе пераносы радка:

pythontxt = '''aaa
  bbb'''
res = re.sub('\n', '!', txt)

print(res)

Вынік выкананага кода:

python'aaa!bbb'

Прыклад

Але, калі трэба замяніць наогул усе сімвалы, то паставіўшы ў рэгулярцы кропку, не захопяцца пераносы радкоў:

pythontxt = '''aaa
  bbb'''
res = re.sub('.', '!', txt)

print(res)

Вынік выкананага кода:

python'!!!
!!!'

Прыклад

Каб выправіць гэтую памылку, варта ўжыць сцяг re.DOTALL:

pythonres = re.sub('.', '!', txt, flags=re.DOTALL)
print(res)

Вынік выкананага кода:

python'!!!!!!!'

Прыклад

У параметры можна перадаць і некалькі сцягоў, паставіўшы паміж імі аператар +. Давайце спачатку замянім літару 'a' у канцы радка:

pythontxt = '''
  aaa
  AAA
  aaa'''
res = re.sub('aaa
, '!', txt)

print(res)

Вынік выкананага кода:

python'''
  aaa
  AAA
  !
'''

Прыклад

Цяпер паставім сцяг re.M:

pythonres = re.sub('aaa
, '!', txt, flags=re.M)
print(res)

Вынік выкананага кода:

python'''
  !
  AAA
  !
'''

Прыклад

Давайце цяпер ужыем яшчэ і сцяг для ігнаравання рэгістру:

pythonres = re.sub('aaa
, '!', txt, flags=re.M+re.IGNORECASE)
print(res)

Вынік выкананага кода:

python'''
  !
  !
  !
'''