Python дээр тогтмол илэрхийлэл боловсруулахын тулд бид стандарт номын сангийн re модулийг ашигладаг. Энэ нь ердийн илэрхийллийн хэв маягийг ашиглан мөрүүдийг задлах, солих, хуваах боломжийг олгодог.
- re — Regular expression operations — Python 3.10.0 Documentation
- Regular Expression HOWTO — Python 3.10.0 Documentation
Энэ хэсэгт бид эхлээд re модулийн үйл ажиллагаа, аргуудыг тайлбарлах болно.
- Тогтмол илэрхийллийн хэв маягийг эмхэтгэх:
compile()
- тохирох объект
- Мөрний эхлэл таарч байгаа эсэхийг шалгаад дараахыг задлана:
match()
- Тоглолтын эхэнд хязгаарлагдахгүй байгаа эсэхийг шалгана уу:
search()
- Бүх мөр таарч байгаа эсэхийг шалгана уу:
fullmatch()
- Бүх тохирох хэсгүүдийн жагсаалтыг авна уу:
findall()
- Бүх тохирох хэсгүүдийг давталт болгон авах:
finditer()
- Тохирох хэсгийг солино уу:
sub()
,subn()
- Тогтмол илэрхийллийн загвар бүхий мөрүүдийг хуваах:
split()
Үүний дараа би re модульд ашиглаж болох мета тэмдэгтүүд (тусгай тэмдэгтүүд) болон тогтмол илэрхийллийн тусгай дарааллыг тайлбарлах болно. Үндсэндээ энэ нь ердийн илэрхийллийн стандарт синтакс боловч туг тавихдаа болгоомжтой байгаарай (ялангуяа re.ASCII).
- Python дээрх ердийн илэрхийллийн мета тэмдэгтүүд, тусгай дараалал, анхааруулга
- Туг тавих
- ASCII тэмдэгтээр хязгаарлагдсан:
re.ASCII
- Том жижиг жижиг жижиг жижиг жижиг үсгийг харгалзахгүй:
re.IGNORECASE
- Мөр бүрийн эхлэл ба төгсгөлийг тааруулна уу:
re.MULTILINE
- Олон тугуудыг зааж өгнө үү
- ASCII тэмдэгтээр хязгаарлагдсан:
- Шуналтай, шуналгүй тоглолтууд
- Тогтмол илэрхийллийн загварыг эмхэтгэх: compile()
- тохирох объект
- Мөрийн эхлэл таарч байгаа эсэхийг шалгаад: match()-г задлана
- Эхлэлээр хязгаарлагдахгүй тохирохыг шалгана уу: хайлт ()
- Бүх мөр таарч байгаа эсэхийг шалгана уу: fullmatch()
- Бүх тохирох хэсгүүдийн жагсаалтыг авах: findall()
- Бүх тохирох хэсгүүдийг давталт болгон авах: finditer()
- Тохирох хэсгүүдийг солино уу: sub(), subn()
- Тогтмол илэрхийллийн загвар бүхий мөрүүдийг хуваах: split()
- Python дээрх ердийн илэрхийллийн мета тэмдэгтүүд, тусгай дараалал, анхааруулга
- Туг тавих
- Шуналтай, шуналгүй тоглолтууд
Тогтмол илэрхийллийн загварыг эмхэтгэх: 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()
Жишээлбэл, эдгээр функцтэй ижил процессыг ердийн илэрхийлэлийн объектуудын тохирох (), дэд () аргуудтай адил гүйцэтгэж болно.
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(), хайлт() гэх мэт нь тохирох объектыг буцаана.
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
Хэрэв та ердийн илэрхийллийн хээний хэсгийг хаалт () бүхий мөрөнд оруулбал тухайн хэсгийг бүлэг болгон боловсруулах болно. Энэ тохиолдолд group() дахь бүлэг тус бүрд тохирох хэсгийн мөрийг tuple хэлбэрээр авч болно.
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
Эхлэлээр хязгаарлагдахгүй тохирохыг шалгана уу: хайлт ()
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
Python 3.4 дээр fullmatch() нэмсэн. Хэрэв та өмнөх хувилбаруудад адилхан хийхийг хүсвэл 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
Тогтмол илэрхийлэлийн загварт хаалт()-аар бүлэглэх нь элементүүд нь бүлэг бүрийн мөрүүд болох залгууруудын жагсаалтыг буцаана. Энэ нь тохирох объект дахь group()-тай тэнцүү байна.
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')]
Хэрэв тохирох зүйл олдохгүй бол хоосон tuple буцаана.
result = re.findall('[0-9]+', s)
print(result)
# []
Бүх тохирох хэсгүүдийг давталт болгон авах: finditer()
finditer() нь тохирох бүх хэсгийг давталт болгон буцаана. Элементүүд нь findall() шиг мөр биш, харин тохирох объектууд тул таарсан хэсгүүдийн байрлалыг (индекс) авах боломжтой.
Давтагч өөрөө контентыг нь авахын тулд print() ашиглан хэвлэх боломжгүй. Хэрэв та Next() эсвэл 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|B A эсвэл 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 болон inline тугуудад мөн нөлөөлдөг.
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'>
Та түүнээс бага эсвэл тэнцүү ашиглаж болно.
- inline туг
(?i)
- товчлол
re.I
Мөр бүрийн эхлэл ба төгсгөлийг тааруулна уу:re.MULTILINEre.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']
Та түүнээс бага эсвэл тэнцүү ашиглаж болно.
- inline туг
(?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
Өгөгдмөл шунахай тоглолт нь гэнэтийн мөртэй таарч болохыг анхаарна уу.