Python тұрақты өрнек модулін қалай пайдалануға болады (сәйкестендіру, іздеу, ішкі және т.б.)

Іскерлік

Python-да тұрақты өрнекті өңдеуді орындау үшін стандартты кітапхананың re модулін қолданамыз. Ол кәдімгі өрнек үлгілерін пайдаланып жолдарды шығаруға, ауыстыруға және бөлуге мүмкіндік береді.

Бұл бөлімде біз алдымен re модулінің функциялары мен әдістерін түсіндіреміз.

  • Тұрақты өрнек үлгілерін құрастыру:compile()
  • сәйкес нысан
  • Жолдың басы сәйкес келетінін тексеріңіз, шығарып алыңыз:match()
  • Сәйкестіктердің басымен шектелмейтінін тексеріңіз:search()
  • Бүкіл жолдың сәйкес келетінін тексеріңіз:fullmatch()
  • Барлық сәйкес бөліктердің тізімін алыңыз:findall()
  • Барлық сәйкес бөліктерді итератор ретінде алыңыз:finditer()
  • Сәйкес бөлікті ауыстырыңыз:sub(),subn()
  • Тұрақты өрнек үлгілері бар жолдарды бөлу:split()

Осыдан кейін мен мета таңбаларды (арнайы таңбалар) және re модулінде қолдануға болатын тұрақты өрнектердің арнайы тізбегін түсіндіремін. Негізінде бұл стандартты тұрақты өрнек синтаксисі, бірақ жалаушаларды орнатуда сақ болыңыз (әсіресе re.ASCII).

  • Python тіліндегі тұрақты өрнек метатаңбалары, арнайы тізбектер және ескертулер
  • Туды орнату
    • ASCII таңбаларымен шектелген:re.ASCII
    • Регистрді ескермейді:re.IGNORECASE
    • Әр жолдың басы мен соңын сәйкестендіріңіз:re.MULTILINE
    • Бірнеше жалаушаларды көрсетіңіз
  • Ашкөз және ашкөз емес матчтар

Тұрақты өрнек үлгісін құрастырыңыз: compile()

re модулінде тұрақты өрнекті өңдеуді орындаудың екі жолы бар.

Функциямен іске қосыңыз

Біріншісі – функция.re.match(),re.sub()Осы сияқты функциялар тұрақты өрнек үлгілерін пайдаланып шығару, ауыстыру және басқа процестерді орындау үшін қолжетімді.

Функциялардың егжей-тегжейлері кейінірек сипатталады, бірақ олардың барлығында бірінші аргумент тұрақты өрнек үлгісінің жолы болып табылады, содан кейін өңделетін жол және т.б. Мысалы, ауыстыруды орындайтын re.sub() ішінде екінші аргумент ауыстыру жолы, ал үшінші аргумент өңделетін жол болып табылады.

import re

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

m = re.match(r'([a-z]+)@([a-z]+)\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

result = re.sub(r'([a-z]+)@([a-z]+)\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net

Осы мысалдағы тұрақты өрнек үлгісіндегі [a-z] a-дан z-ге дейінгі кез келген таңбаны (яғни, кіші әріптер) білдіретінін және + алдыңғы үлгіні (бұл жағдайда [a-z]) бір немесе бірнеше рет қайталауды білдіретінін ескеріңіз. [a-z]+ бір немесе бірнеше кіші әріптік таңбаларды қайталайтын кез келген жолға сәйкес келеді.

. мета таңба (ерекше мағынасы бар таңба) және кері қиғаш сызықпен құтылу керек.

Тұрақты өрнек үлгі жолдары жиі кері қиғаш сызықтарды көп пайдаланатындықтан, мысалдағыдай өңделмеген жолдарды пайдалану ыңғайлы.

Тұрақты өрнек үлгісі нысанының әдісінде іске қосылады

re модуліндегі тұрақты өрнектерді өңдеудің екінші жолы – тұрақты өрнек үлгісі нысанының әдісі.

re.compile() көмегімен тұрақты өрнек үлгісі нысанын жасау үшін тұрақты өрнек үлгісі жолын құрастыруға болады.

p = re.compile(r'([a-z]+)@([a-z]+)\.com')

print(p)
# re.compile('([a-z]+)@([a-z]+)\\.com')

print(type(p))
# <class 're.Pattern'>

re.match(),re.sub()Мысалы, осы функциялар сияқты бірдей процесті тұрақты өрнек нысандарының сәйкес (), sub() әдістері сияқты орындауға болады.

m = p.match(s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

result = p.sub('new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net

Төменде сипатталған барлық re.xxx() функциялары қалыпты өрнек нысанының әдістері ретінде де берілген.

Бір үлгіні пайдаланатын процесті қайталап жатсаңыз, re.compile() көмегімен тұрақты өрнек нысанын жасау және оны айналасында пайдалану тиімдірек болады.

Келесі үлгі кодында функция ыңғайлы болу үшін компиляциясыз пайдаланылады, бірақ бір үлгіні қайталап пайдаланғыңыз келсе, оны алдын ала құрастырып, оны тұрақты өрнек нысанының әдісі ретінде орындау ұсынылады.

сәйкес нысан

match(), search(), т.б. сәйкестік нысанын қайтарады.

s = 'aaa@xxx.com'

m = re.match(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(type(m))
# <class 're.Match'>

Сәйкес келетін жол мен орын сәйкестік нысанының келесі әдістерін қолдану арқылы алынады.

  • Матчтың өтетін орнын алыңыз:start(),end(),span()
  • Сәйкес жолды алыңыз:group()
  • Әр топ үшін жолды алыңыз:groups()
print(m.start())
# 0

print(m.end())
# 11

print(m.span())
# (0, 11)

print(m.group())
# aaa@xxx.com

Егер тұрақты өрнек үлгісінің бөлігін жақша() арқылы жолға алсаңыз, бөлік топ ретінде өңделеді. Бұл жағдайда топтардағы () әрбір топқа сәйкес келетін бөліктің жолын кортеж ретінде алуға болады.

m = re.match(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(m.groups())
# ('aaa', 'xxx', 'com')

Жолдың басы сәйкес келетінін тексеріңіз, шығарып алыңыз: match()

match() егер жолдың басы үлгіге сәйкес келсе, сәйкестік нысанын қайтарады.

Жоғарыда айтылғандай, сәйкестік нысаны сәйкес келетін ішкі жолды шығару үшін немесе сәйкестік жасалғанын тексеру үшін пайдаланылуы мүмкін.

match() тек басын тексереді. Егер басында сәйкес жол болмаса, ол None қайтарады.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

m = re.match(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

m = re.match(r'[a-z]+@[a-z]+\.net', s)
print(m)
# None

Тек басымен шектелмейтін сәйкестіктерді тексеріңіз, шығарып алыңыз: search()

match() сияқты, ол сәйкес келсе, сәйкестік нысанын қайтарады.

Бірнеше сәйкес бөліктер болса, тек бірінші сәйкес бөлік қайтарылады.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

m = re.search(r'[a-z]+@[a-z]+\.net', s)
print(m)
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>

m = re.search(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

Барлық сәйкес бөліктерді алғыңыз келсе, төменде сипатталғандай findall() немесе finditer() пайдаланыңыз.

Бүкіл жолдың сәйкес келетінін тексеріңіз: fullmatch()

Бүкіл жолдың қалыпты өрнек үлгісіне сәйкес келетінін тексеру үшін fullmatch() пайдаланыңыз. Бұл, мысалы, жолдың электрондық пошта мекенжайы ретінде жарамды немесе жарамсыз екенін тексеру үшін пайдалы.

Бүкіл жол сәйкес келсе, сәйкестік нысаны қайтарылады.

s = 'aaa@xxx.com'

m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

Сәйкес келмейтін бөліктер болса (тек жартылай сәйкестіктер немесе мүлде сәйкестіктер жоқ), Ешбірі қайтарылмайды.

s = '!!!aaa@xxx.com!!!'

m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# None

fullmatch() Python 3.4 нұсқасына қосылды. Бұрынғы нұсқаларда солай істегіңіз келсе, match() және соңында сәйкес келетін $ мета таңбасын пайдаланыңыз. Бүкіл жол басынан аяғына сәйкес келмесе, ол None қайтарады.

s = '!!!aaa@xxx.com!!!'

m = re.match(r'[a-z]+@[a-z]+\.com$', s)
print(m)
# None

Барлық сәйкес бөліктердің тізімін алыңыз: findall()

findall() барлық сәйкес ішкі жолдардың тізімін қайтарады. Тізім элементтері сәйкес келетін нысандар емес, жолдар екенін ескеріңіз.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

result = re.findall(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# ['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.net']

Сәйкес бөліктердің санын тізімдегі элементтердің санын қайтаратын len() кірістірілген функциясы арқылы тексеруге болады.

print(len(result))
# 3

Тұрақты өрнек үлгісіндегі жақшалармен() топтастыру элементтері әр топтың жолдары болып табылатын кортеждердің тізімін береді. Бұл сәйкестік нысанындағы топтарға() баламасы.

result = re.findall(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(result)
# [('aaa', 'xxx', 'com'), ('bbb', 'yyy', 'com'), ('ccc', 'zzz', 'net')]

Топтық жақшаларды () кірістіруге болады, сондықтан толық сәйкестікті де алғыңыз келсе, барлық сәйкестікті жақшаға () қойыңыз.

result = re.findall(r'(([a-z]+)@([a-z]+)\.([a-z]+))', s)
print(result)
# [('aaa@xxx.com', 'aaa', 'xxx', 'com'), ('bbb@yyy.com', 'bbb', 'yyy', 'com'), ('ccc@zzz.net', 'ccc', 'zzz', 'net')]

Сәйкестік табылмаса, бос кортеж қайтарылады.

result = re.findall('[0-9]+', s)
print(result)
# []

Барлық сәйкес бөліктерді итератор ретінде алыңыз: finditer()

finditer() барлық сәйкес бөліктерді итератор ретінде қайтарады. Элементтер findall() сияқты жолдар емес, сәйкес нысандар, сондықтан сәйкес бөліктердің орнын (индексін) алуға болады.

Итератордың өзін оның мазмұнын алу үшін print() арқылы басып шығару мүмкін емес. Келесі() кірістірілген функцияны немесе for операторын пайдалансаңыз, мазмұнды бір-бірлеп алуға болады.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# <callable_iterator object at 0x10b0efa90>

print(type(result))
# <class 'callable_iterator'>

for m in result:
    print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>

Оны list() арқылы тізімге түрлендіруге де болады.

l = list(re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s))
print(l)
# [<re.Match object; span=(0, 11), match='aaa@xxx.com'>, <re.Match object; span=(13, 24), match='bbb@yyy.com'>, <re.Match object; span=(26, 37), match='ccc@zzz.net'>]

print(l[0])
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(type(l[0]))
# <class 're.Match'>

print(l[0].span())
# (0, 11)

Егер сіз барлық сәйкес бөліктердің орнын алғыңыз келсе, тізімді түсіну белгісі list() орнына ыңғайлырақ.

print([m.span() for m in re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)])
# [(0, 11), (13, 24), (26, 37)]

Итератор элементтерді ретімен шығарады. Соңына жеткеннен кейін көбірек элементтерді шығаруға тырыссаңыз, сізде ештеңе қалмайтынын ескеріңіз.

result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)

for m in result:
    print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>

print(list(result))
# []

Сәйкес бөліктерді ауыстырыңыз: sub(), subn()

sub() арқылы сәйкес бөлікті басқа жолға ауыстыруға болады. Ауыстырылған жол қайтарылады.

s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'

result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net

print(type(result))
# <class 'str'>

Жақша() арқылы топтастыру кезінде сәйкес жолды ауыстырылған жолда пайдалануға болады.

Әдепкі бойынша, төмендегілерге қолдау көрсетіледі: шикі жолдар болып табылмайтын қалыпты жолдар үшін кері қиғаш сызықтан құтылу үшін кері қиғаш сызықтың алдында тізімде болуы керек екенін ескеріңіз.

\1Бірінші жақша
\2Екінші жақша
\3Үшінші жақша
result = re.sub(r'([a-z]+)@([a-z]+)\.com', r'\1@\2.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net

?P<xxx>
Егер сіз топты тұрақты өрнек үлгісінің жақшаларының басына жазу арқылы атасаңыз, оны төменде көрсетілгендей санның орнына атау арқылы көрсетуге болады.
\g<xxx>

result = re.sub(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net

Аргумент саны ауыстырулардың ең көп санын көрсетеді. Тек сол жақтағы санақ ауыстырылады.

result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# new-address, bbb@yyy.com, ccc@zzz.net

subn() ауыстырылған жолдың кортежін (sub() қайтаратын мәнімен бірдей) және ауыстырылған бөліктер санын (үлгіге сәйкес келетін сан) қайтарады.

result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# ('new-address, new-address, ccc@zzz.net', 2)

Аргументтерді көрсету әдісі sub() әдісімен бірдей. Жақшалар арқылы топтастырылған бөлікті пайдалануға немесе аргумент санын көрсетуге болады.

result = re.subn(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# ('aaa@xxx.net, bbb@yyy.net, ccc@zzz.net', 2)

result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# ('new-address, bbb@yyy.com, ccc@zzz.net', 1)

Тұрақты өрнек үлгілері бар жолдарды бөлу: split()

split() жолды үлгіге сәйкес бөлікке бөледі және оны тізім ретінде қайтарады.

Бірінші және соңғы сәйкестіктерде нәтиже тізімінің басында және соңында бос жолдар болатынын ескеріңіз.

s = '111aaa222bbb333'

result = re.split('[a-z]+', s)
print(result)
# ['111', '222', '333']

result = re.split('[0-9]+', s)
print(result)
# ['', 'aaa', 'bbb', '']

maxsplit аргументі бөлінулердің (бөлшектердің) максималды санын көрсетеді. Тек сол жақтағы санақ бөлінеді.

result = re.split('[a-z]+', s, 1)
print(result)
# ['111', '222bbb333']

Python тіліндегі тұрақты өрнек метатаңбалары, арнайы тізбектер және ескертулер

Python 3 re модулінде пайдалануға болатын негізгі тұрақты өрнек мета таңбалары (арнайы таңбалар) және арнайы реттіліктер төмендегідей

метатаңбамазмұны
.Жаңа жолдан басқа кез келген жалғыз таңба (соның ішінде DOTALL жалаушасы бар жаңа жол)
^Жолдың басы (сонымен қатар әр жолдың басына MULTILINE жалаушасы сәйкес келеді)
$Жолдың соңы (сонымен қатар әр жолдың соңына MULTILINE жалаушасы сәйкес келеді)
*Алдыңғы үлгіні 0 реттен артық қайталаңыз
+Алдыңғы үлгіні кем дегенде бір рет қайталаңыз.
?Алдыңғы үлгіні 0 немесе 1 рет қайталаңыз
{m}Алдыңғы үлгіні m рет қайталаңыз
{m, n}Соңғы үлгі.m~nқайталаңыз
[]Кейіпкерлер жиынтығы[]Осы кейіпкерлердің кез келгеніне сәйкес келеді
|НЕМЕСЕA|BA немесе B үлгісіне сәйкес келеді
ерекше реттілікмазмұны
\dЮникодты ондық сандар (ASCII жалауы арқылы ASCII сандарымен шектелген)
\D\dБұған қарама-қарсы мағынаны білдіреді.
\sЮникод бос орын таңбалары (ASCII жалауы арқылы ASCII бос орын таңбаларымен шектелген)
\S\sБұған қарама-қарсы мағынаны білдіреді.
\wЮникодты сөз таңбалары мен астын сызу (ASCII әріптік-сандық таңбалармен және ASCII жалауымен астын сызулармен шектелген)
\W\wБұған қарама-қарсы мағынаны білдіреді.

Олардың барлығы осы кестеде көрсетілмеген. Толық тізім үшін ресми құжаттаманы қараңыз.

Сондай-ақ Python 2-де кейбір мағыналардың әртүрлі екенін ескеріңіз.

Туды орнату

Жоғарыдағы кестеде көрсетілгендей кейбір мета таңбалар мен арнайы тізбектер жалаушаға байланысты өз режимін өзгертеді.

Мұнда тек негізгі жалаулар ғана қамтылған. Қалғандары үшін ресми құжаттаманы қараңыз.

ASCII таңбаларымен шектелген: re.ASCII

\wБұл Python 3 жолдары үшін әдепкі бойынша қос байтты канжиге, әріптік-сандық таңбаларға және т.б. сәйкес болады. Ол келесіге тең емес, себебі ол стандартты тұрақты өрнек емес.[a-zA-Z0-9_]

m = re.match(r'\w+', '漢字ABC123')
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>

m = re.match('[a-zA-Z0-9_]+', '漢字ABC123')
print(m)
# None

Әрбір функциядағы аргумент жалаушалары үшін re.ASCII көрсетсеңіз немесе тұрақты өрнек үлгісі жолының басына келесі кірістірілген жалаушаны қоссаңыз, ол тек ASCII таңбаларына сәйкес келеді (ол екі байт жапон, әріптік-сандық таңбаларға және т.б. сәйкес келмейді). .).
(?a)
Бұл жағдайда келесі екеуі баламалы.
\w#ERROR![a-zA-Z0-9_]

m = re.match(r'\w+', '漢字ABC123', flags=re.ASCII)
print(m)
# None

m = re.match(r'(?a)\w+', '漢字ABC123')
print(m)
# None

Бұл re.compile() арқылы компиляциялау кезінде де қолданылады. Аргумент жалаушаларын немесе кірістірілген жалаушаларды пайдаланыңыз.

p = re.compile(r'\w+', flags=re.ASCII)
print(p)
# re.compile('\\w+', re.ASCII)

print(p.match('漢字ABC123'))
# None

p = re.compile(r'(?a)\w+')
print(p)
# re.compile('(?a)\\w+', re.ASCII)

print(p.match('漢字ABC123'))
# None

ASCII қысқа пішіні re ретінде де қол жетімді. A. Сіз де пайдалана аласыз.

print(re.ASCII is re.A)
# True

\W, қарама-қарсы \W, re.ASCII және кірістірілген жалаушалармен де әсер етеді.

m = re.match(r'\W+', '漢字ABC123')
print(m)
# None

m = re.match(r'\W+', '漢字ABC123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>

\w сияқты, келесі екеуі әдепкі бойынша бір байтты және қос байтты таңбаларға сәйкес келеді, бірақ re.ASCII немесе кірістірілген жалаушалар көрсетілген болса, бір байттық таңбалармен шектеледі.

  • Сандарды сәйкестендір\d
  • Бос орынға сәйкес келеді\s
  • Сан еместерге сәйкес келеді\D
  • Кез келген бос орынға сәйкес келеді.\S
m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>

m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>

m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 3), match='123'>

m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# None

m = re.match(r'\s+', ' ')  # full-width space
print(m)
# <re.Match object; span=(0, 1), match='\u3000'>

m = re.match(r'\s+', ' ', flags=re.ASCII)
print(m)
# None

Регистрді ескермейді:re.IGNORECASE

Әдепкі бойынша, ол регистрді ескереді. Екеуін де сәйкестендіру үшін үлгіге бас әріптерді де, кіші әріптерді де қосу керек.

re.IGNORECASEБұл көрсетілсе, ол регистрді ескермей сәйкес келеді. Стандартты тұрақты өрнектердегі i жалауына балама.

m = re.match('[a-zA-Z]+', 'abcABC')
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>

m = re.match('[a-z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>

m = re.match('[A-Z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>

Сіз аз немесе тең пайдалана аласыз.

  • кірістірілген жалау(?i)
  • аббревиатураre.I

Әр жолдың басы мен соңын сәйкестендіріңіз:re.MULTILINE

^Бұл тұрақты өрнектегі мета таңбалар жолдың басына сәйкес келеді.

Әдепкі бойынша, бүкіл жолдың басы ғана сәйкес келеді, бірақ келесі әр жолдың басына да сәйкес келеді. Стандартты тұрақты өрнектердегі m жалауына тең.
re.MULTILINE

s = '''aaa-xxx
bbb-yyy
ccc-zzz'''

print(s)
# aaa-xxx
# bbb-yyy
# ccc-zzz

result = re.findall('[a-z]+', s)
print(result)
# ['aaa', 'xxx', 'bbb', 'yyy', 'ccc', 'zzz']

result = re.findall('^[a-z]+', s)
print(result)
# ['aaa']

result = re.findall('^[a-z]+', s, flags=re.MULTILINE)
print(result)
# ['aaa', 'bbb', 'ccc']

$Жолдың соңына сәйкес келеді. Әдепкі бойынша, тек бүкіл жолдың соңы сәйкес келеді.
re.MULTILINEМұны көрсетсеңіз, ол әр жолдың соңына да сәйкес келеді.

result = re.findall('[a-z]+$', s)
print(result)
# ['zzz']

result = re.findall('[a-z]+$', s, flags=re.MULTILINE)
print(result)
# ['xxx', 'yyy', 'zzz']

Сіз аз немесе тең пайдалана аласыз.

  • кірістірілген жалау(?m)
  • аббревиатураre.M

Бірнеше жалаушаларды көрсетіңіз

|Бір уақытта бірнеше жалаушаларды қосқыңыз келсе, мұны пайдаланыңыз. Кірістірілген жалаушалар жағдайында әрбір таңбадан кейін төменде көрсетілгендей әріп болуы керек.
(?am)

s = '''aaa-xxx
漢漢漢-字字字
bbb-zzz'''

print(s)
# aaa-xxx
# 漢漢漢-字字字
# bbb-zzz

result = re.findall(r'^\w+', s, flags=re.M)
print(result)
# ['aaa', '漢漢漢', 'bbb']

result = re.findall(r'^\w+', s, flags=re.M | re.A)
print(result)
# ['aaa', 'bbb']

result = re.findall(r'(?am)^\w+', s)
print(result)
# ['aaa', 'bbb']

Ашкөз және ашкөз емес матчтар

Бұл Python-дағы мәселе емес, тұрақты өрнектерге қатысты жалпы мәселе, бірақ мен бұл туралы жазамын, себебі ол мені қиындыққа ұшыратады.

Әдепкі бойынша, келесі ең ұзын жолға сәйкес келетін ашкөз сәйкестік болып табылады.

  • *
  • +
  • ?
s = 'aaa@xxx.com, bbb@yyy.com'

m = re.match(r'.+com', s)
print(m)
# <re.Match object; span=(0, 24), match='aaa@xxx.com, bbb@yyy.com'>

print(m.group())
# aaa@xxx.com, bbb@yyy.com

? кейін ол ең қысқа жолға сәйкес келетін ашкөз емес, минималды сәйкестікке әкеледі.

  • *?
  • +?
  • ??
m = re.match(r'.+?com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>

print(m.group())
# aaa@xxx.com

Әдепкі ашкөз сәйкестік күтпеген жолдарға сәйкес келуі мүмкін екенін ескеріңіз.