Python-da müntəzəm ifadə emalını həyata keçirmək üçün standart kitabxananın re modulundan istifadə edirik. Bu, müntəzəm ifadə nümunələrindən istifadə edərək sətirləri çıxarmağa, dəyişdirməyə və bölməyə imkan verir.
- re — Regular expression operations — Python 3.10.0 Documentation
- Regular Expression HOWTO — Python 3.10.0 Documentation
Bu bölmədə biz əvvəlcə re modulunun funksiyalarını və üsullarını izah edəcəyik.
- Normal ifadə nümunələrinin tərtib edilməsi:
compile()
- uyğun obyekt
- Sətin başlanğıcının uyğun olub olmadığını yoxlayın, çıxarın:
match()
- Başlanğıc ilə məhdudlaşmayan uyğunluqları yoxlayın:
search()
- Bütün sətirin uyğun olub olmadığını yoxlayın:
fullmatch()
- Bütün uyğun hissələrin siyahısını əldə edin:
findall()
- Bütün uyğun hissələri iterator kimi əldə edin:
finditer()
- Uyğun hissəni dəyişdirin:
sub()
,subn()
- Müntəzəm ifadə nümunələri ilə sətirlərin bölünməsi:
split()
Bundan sonra re modulunda istifadə oluna bilən meta simvolları (xüsusi simvollar) və müntəzəm ifadələrin xüsusi ardıcıllıqlarını izah edəcəyəm. Əsasən, bu, standart müntəzəm ifadə sintaksisidir, lakin bayraqları təyin edərkən diqqətli olun (xüsusilə re.ASCII).
- Python-da müntəzəm ifadə meta simvolları, xüsusi ardıcıllıqlar və xəbərdarlıqlar
- Bayrağın qurulması
- ASCII simvolları ilə məhdudlaşır:
re.ASCII
- Hərflərə həssas deyil:
re.IGNORECASE
- Hər sətrin əvvəlini və sonunu uyğunlaşdırın:
re.MULTILINE
- Çoxlu bayraqları təyin edin
- ASCII simvolları ilə məhdudlaşır:
- Acgöz və acgöz olmayan matçlar
- Normal ifadə nümunəsini tərtib edin: compile()
- uyğun obyekt
- Sətin başlanğıcının uyğun olub olmadığını yoxlayın, çıxarın: match()
- Başlanğıc ilə məhdudlaşmayan uyğunluqları yoxlayın, çıxarın: search()
- Bütün sətirin uyğun olub olmadığını yoxlayın: fullmatch()
- Bütün uyğun hissələrin siyahısını əldə edin: findall()
- Bütün uyğun hissələri iterator kimi əldə edin: finditer()
- Uyğun hissələri dəyişdirin: sub(), subn()
- Normal ifadə nümunələri ilə sətirlərin bölünməsi: split()
- Python-da müntəzəm ifadə meta simvolları, xüsusi ardıcıllıqlar və xəbərdarlıqlar
- Bayrağın qurulması
- Acgöz və acgöz olmayan matçlar
Normal ifadə nümunəsini tərtib edin: compile()
re modulunda müntəzəm ifadə emalını yerinə yetirməyin iki yolu var.
Funksiya ilə işləyin
Birincisi funksiyadır.re.match()
,re.sub()
Bu kimi funksiyalar müntəzəm ifadə nümunələrindən istifadə edərək çıxarma, dəyişdirmə və digər prosesləri yerinə yetirmək üçün mövcuddur.
Funksiyaların təfərrüatları daha sonra təsvir olunacaq, lakin onların hamısında birinci arqument müntəzəm ifadə modelinin sətridir, ondan sonra emal ediləcək sətir və s. Məsələn, əvəzetməni həyata keçirən re.sub() funksiyasında ikinci arqument əvəzedici sətir, üçüncü arqument isə emal ediləcək sətirdir.
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
Qeyd edək ki, bu misaldakı müntəzəm ifadə nümunəsindəki [a-z] a-dan z-ə qədər hər hansı simvol (yəni kiçik hərflər) deməkdir və + əvvəlki nümunənin (bu halda [a-z]) bir və ya bir neçə dəfə təkrarlanması deməkdir. [a-z]+ bir və ya bir neçə kiçik əlifba simvolunu təkrarlayan istənilən sətirlə uyğun gəlir.
. meta simvoldur (xüsusi məna daşıyan simvol) və əks kəsik işarəsi ilə qaçmaq lazımdır.
Müntəzəm ifadə nümunəsi sətirləri tez-tez çoxlu əks xətlərdən istifadə etdiyi üçün nümunədəki kimi xam sətirlərdən istifadə etmək rahatdır.
Normal ifadə nümunəsi obyektinin metodunda çalışır
re modulunda müntəzəm ifadələri emal etməyin ikinci yolu müntəzəm ifadə nümunəsi obyekt metodudur.
re.compile() istifadə edərək müntəzəm ifadə nümunəsi obyekti yaratmaq üçün müntəzəm ifadə nümunəsi sətirini tərtib edə bilərsiniz.
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əsələn, bu funksiyalarla eyni proses müntəzəm ifadə obyektlərinin uyğunluğu(),sub() metodları kimi icra oluna bilər.
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
Aşağıda təsvir edilən bütün re.xxx() funksiyaları müntəzəm ifadə obyektinin metodları kimi də təqdim olunur.
Eyni nümunədən istifadə edən prosesi təkrar edirsinizsə, re.compile() ilə müntəzəm ifadə obyekti yaratmaq və onu ətrafında istifadə etmək daha səmərəlidir.
Aşağıdakı nümunə kodda funksiya rahatlıq üçün tərtib edilmədən istifadə olunur, lakin eyni nümunəni təkrar istifadə etmək istəyirsinizsə, onu əvvəlcədən tərtib etmək və müntəzəm ifadə obyektinin metodu kimi icra etmək tövsiyə olunur.
uyğun obyekt
match(), search() və s. uyğunluq obyekti qaytarır.
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'>
Uyğun sətir və mövqe uyğunluq obyektinin aşağıdakı üsullarından istifadə etməklə əldə edilir.
- Matçın yerini əldə edin:
start()
,end()
,span()
- Uyğun sətir alın:
group()
- Hər qrup üçün sətir alın:
groups()
print(m.start())
# 0
print(m.end())
# 11
print(m.span())
# (0, 11)
print(m.group())
# aaa@xxx.com
Normal ifadə nümunəsinin bir hissəsini mötərizə() ilə sətirə əlavə etsəniz, hissə qrup kimi işlənəcək. Bu halda, group()-da hər bir qrupa uyğun gələn hissənin sətri tuple kimi əldə edilə bilər.
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')
Sətin başlanğıcının uyğun olub olmadığını yoxlayın, çıxarın: match()
match() sətirin başlanğıcı naxışa uyğun gəlirsə, uyğunluq obyektini qaytarır.
Yuxarıda qeyd edildiyi kimi, uyğunluq obyekti uyğun gələn alt sətri çıxarmaq və ya sadəcə uyğunluğun olub olmadığını yoxlamaq üçün istifadə edilə bilər.
match() yalnız başlanğıcı yoxlayacaq. Başlanğıcda uyğun gələn sətir yoxdursa, o, Yox qaytarır.
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
Başlanğıc ilə məhdudlaşmayan uyğunluqları yoxlayın, çıxarın: search()
match() kimi, uyğun gələrsə, uyğunluq obyektini qaytarır.
Bir neçə uyğun gələn hissə varsa, yalnız birinci uyğun gələn hissə qaytarılacaq.
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'>
Bütün uyğun hissələri əldə etmək istəyirsinizsə, aşağıda təsvir edildiyi kimi findall() və ya finditer() istifadə edin.
Bütün sətirin uyğun olub olmadığını yoxlayın: fullmatch()
Bütün sətirin normal ifadə nümunəsinə uyğun olub olmadığını yoxlamaq üçün fullmatch() istifadə edin. Bu, məsələn, sətirin e-poçt ünvanı kimi etibarlı olub olmadığını yoxlamaq üçün faydalıdır.
Bütün sətir uyğun gəlirsə, uyğunluq obyekti qaytarılır.
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'>
Uyğun olmayan hissələr varsa (yalnız qismən uyğunluqlar və ya heç bir uyğunluq yoxdur), Heç biri qaytarılmır.
s = '!!!aaa@xxx.com!!!'
m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# None
Fullmatch() Python 3.4-də əlavə edildi. Əgər əvvəlki versiyalarda eyni şeyi etmək istəyirsinizsə, sonunda match() və uyğun meta simvolu $ istifadə edin. Başdan sona bütün sətir uyğun gəlmirsə, o, Yox qaytarır.
s = '!!!aaa@xxx.com!!!'
m = re.match(r'[a-z]+@[a-z]+\.com$', s)
print(m)
# None
Bütün uyğun hissələrin siyahısını əldə edin: findall()
findall() bütün uyğun gələn alt sətirlərin siyahısını qaytarır. Qeyd edək ki, siyahının elementləri uyğun obyektlər deyil, sətirlərdir.
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']
Uyğun hissələrin sayı siyahıdakı elementlərin sayını qaytaran daxili funksiya len() vasitəsilə yoxlanıla bilər.
print(len(result))
# 3
Normal ifadə nümunəsində mötərizələrlə() qruplaşdırma elementləri hər qrupun sətirləri olan dəstlərin siyahısını qaytarır. Bu, uyğunluq obyektindəki qruplara() bərabərdir.
result = re.findall(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(result)
# [('aaa', 'xxx', 'com'), ('bbb', 'yyy', 'com'), ('ccc', 'zzz', 'net')]
Qrup mötərizələri () iç-içə ola bilər, buna görə də bütün uyğunluğu əldə etmək istəyirsinizsə, sadəcə olaraq bütün uyğunluğu mötərizə () içərisinə daxil edin.
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')]
Heç bir uyğunluq tapılmazsa, boş dəst qaytarılır.
result = re.findall('[0-9]+', s)
print(result)
# []
Bütün uyğun hissələri iterator kimi əldə edin: finditer()
finditer() iterator kimi bütün uyğun hissələri qaytarır. Elementlər findall() kimi sətirlər deyil, uyğun obyektlərdir, beləliklə siz uyğun hissələrin mövqeyini (indeksini) əldə edə bilərsiniz.
İteratorun özü məzmununu əldə etmək üçün print() ilə çap edilə bilməz. Daxili funksiyadan next() və ya for ifadəsindən istifadə etsəniz, məzmunu bir-bir əldə edə bilərsiniz.
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'>
O, həmçinin list() ilə siyahıya çevrilə bilər.
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)
Bütün uyğun gələn hissələrin mövqeyini əldə etmək istəyirsinizsə, siyahı başa düşmə notasiyası list() funksiyasından daha rahatdır.
print([m.span() for m in re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)])
# [(0, 11), (13, 24), (26, 37)]
İterator elementləri sıra ilə çıxarır. Nəzərə alın ki, sona çatdıqdan sonra daha çox element çıxarmağa çalışsanız, heç bir şey qalmayacaq.
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))
# []
Uyğun hissələri dəyişdirin: sub(), subn()
Sub() funksiyasından istifadə edərək, uyğun gələn hissəni başqa sətirlə əvəz edə bilərsiniz. Əvəz edilmiş sətir geri qaytarılacaq.
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'>
Mötərizələr() ilə qruplaşdırarkən uyğun gələn sətir dəyişdirilmiş sətirdə istifadə edilə bilər.
Varsayılan olaraq, aşağıdakılar dəstəklənir: Nəzərə alın ki, xam sətirlər olmayan normal sətirlər üçün tərs xəttdən qaçmaq üçün tərs kəsişmədən əvvəl əks xətt qeyd edilməlidir.
\1 | Birinci mötərizə |
\2 | İkinci mötərizə |
\3 | Üçüncü mötərizə |
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>
Bunu müntəzəm ifadə nümunəsinin mötərizələrinin əvvəlinə yazaraq qrupu adlandırsanız, aşağıda göstərildiyi kimi onu nömrə əvəzinə addan istifadə edərək təyin edə bilərsiniz.\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
Arqumentlərin sayı dəyişdirmələrin maksimum sayını təyin edir. Yalnız sol tərəfdən sayı əvəz olunacaq.
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() əvəz edilmiş sətirin cərgəsini (sub() funksiyasının qaytarılması dəyəri ilə eyni) və əvəz edilmiş hissələrin sayını (naxışa uyğun gələn nömrə) qaytarır.
result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# ('new-address, new-address, ccc@zzz.net', 2)
Arqumentlərin təyin edilməsi üsulu sub() ilə eynidir. Mötərizədə qruplaşdırılmış hissədən istifadə edə və ya arqumentlərin sayını təyin edə bilərsiniz.
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)
Normal ifadə nümunələri ilə sətirlərin bölünməsi: split()
split() sətri naxışa uyğun gələn hissəyə bölür və onu siyahı kimi qaytarır.
Nəzərə alın ki, ilk və son uyğunluqlar nəticələnən siyahının əvvəlində və sonunda boş sətirlərdən ibarət olacaq.
s = '111aaa222bbb333'
result = re.split('[a-z]+', s)
print(result)
# ['111', '222', '333']
result = re.split('[0-9]+', s)
print(result)
# ['', 'aaa', 'bbb', '']
Maxsplit arqumenti bölünmələrin (parçaların) maksimum sayını təyin edir. Yalnız sol tərəfdən sayı bölünəcək.
result = re.split('[a-z]+', s, 1)
print(result)
# ['111', '222bbb333']
Python-da müntəzəm ifadə meta simvolları, xüsusi ardıcıllıqlar və xəbərdarlıqlar
Python 3 re modulunda istifadə edilə bilən əsas müntəzəm ifadə meta simvolları (xüsusi simvollar) və xüsusi ardıcıllıqlar aşağıdakılardır.
metaxarakter | məzmunu |
---|---|
. | Yeni sətirdən başqa hər hansı bir simvol (DOTALL bayrağı ilə yeni sətir daxil olmaqla) |
^ | Sətirin başlanğıcı (həmçinin MULTILINE bayrağı ilə hər sətrin əvvəlinə uyğun gəlir) |
$ | Sətirin sonu (həmçinin MULTILINE bayrağı ilə hər sətrin sonuna uyğun gəlir) |
* | Əvvəlki nümunəni 0 dəfədən çox təkrarlayın |
+ | Əvvəlki nümunəni ən azı bir dəfə təkrarlayın. |
? | Əvvəlki nümunəni 0 və ya 1 dəfə təkrarlayın |
{m} | Əvvəlki nümunəni m dəfə təkrarlayın |
{m, n} | Son model.m ~n təkrarlamaq |
[] | Simvollar toplusu[] Bu simvollardan hər hansı birinə uyğun gəlir |
| | YAA|B A və ya B nümunəsinə uyğun gəlir |
xüsusi ardıcıllıq | məzmunu |
---|---|
\d | Unicode decimal ədədləri (ASCII bayrağı ilə ASCII nömrələri ilə məhdudlaşır) |
\D | \d Bunun əksini nəzərdə tutur. |
\s | Unicode boşluq simvolları (ASCII bayrağı ilə ASCII boşluq simvolları ilə məhdudlaşır) |
\S | \s Bunun əksini nəzərdə tutur. |
\w | Unicode söz simvolları və alt xətt (ASCII alfasayı simvolları və ASCII bayrağı ilə alt xətt ilə məhdudlaşır) |
\W | \w Bunun əksini nəzərdə tutur. |
Onların hamısı bu cədvəldə göstərilməyib. Tam siyahı üçün rəsmi sənədlərə baxın.
Python 2-də bəzi mənaların fərqli olduğunu da nəzərə alın.
Bayrağın qurulması
Yuxarıdakı cədvəldə göstərildiyi kimi, bəzi meta simvollar və xüsusi ardıcıllıqlar bayraqdan asılı olaraq öz rejimini dəyişir.
Burada yalnız əsas bayraqlar əhatə olunub. Qalanları üçün rəsmi sənədlərə baxın.
ASCII simvolları ilə məhdudlaşır: re.ASCII
\w
Bu, həmçinin Python 3 sətirləri üçün defolt olaraq cüt baytlı kanci, alfasayısal simvollar və s. uyğun olacaq. Standart normal ifadə olmadığı üçün aşağıdakılara ekvivalent deyil.[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
Hər bir funksiyada arqument bayraqları üçün re.ASCII təyin etsəniz və ya müntəzəm ifadə nümunəsi sətirinin əvvəlinə aşağıdakı daxili bayrağı əlavə etsəniz, o, yalnız ASCII simvollarına uyğun olacaq (iki baytlıq Yapon, alfasayısal simvollar və s. uyğun gəlməyəcək) .).(?a)
Bu halda, aşağıdakı ikisi ekvivalentdir.\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
Eyni şey re.compile() ilə tərtib edərkən də tətbiq olunur. Arqument bayraqlarından və ya daxili bayraqlardan istifadə edin.
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 də qısa forma re kimi mövcuddur. A. Siz hər ikisindən istifadə edə bilərsiniz.
print(re.ASCII is re.A)
# True
\W-nin əksi olan \W re.ASCII və daxili bayraqlardan da təsirlənir.
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 ilə olduğu kimi, aşağıdakı ikisi defolt olaraq həm tək baytlıq, həm də iki baytlıq simvollara uyğun gəlir, lakin re.ASCII və ya sətirli bayraqlar təyin olunarsa, tək baytlıq simvollarla məhdudlaşır.
- Rəqəmləri uyğunlaşdırın
\d
- Boş yerə uyğun gəlir
\s
- Qeyri-rəqəmlərə uyğun gəlir
\D
- İstənilən boş yerə uyğun gəlir.
\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
Hərflərə həssas deyil:re.IGNORECASE
Varsayılan olaraq, hərflərə həssasdır. Hər ikisini uyğunlaşdırmaq üçün naxışa həm böyük, həm də kiçik hərfləri daxil etməlisiniz.
re.IGNORECASE
Bu qeyd olunarsa, o, hərf hərfi ilə uyğunlaşacaq. Standart normal ifadələrdə i bayrağına bərabərdir.
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'>
Siz az və ya bərabər istifadə edə bilərsiniz.
- daxili bayraq
(?i)
- abbreviatura
re.I
Hər sətrin əvvəlini və sonunu uyğunlaşdırın:re.MULTILINE
^
Bu müntəzəm ifadədəki meta simvollar sətrin əvvəlinə uyğun gəlir.
Varsayılan olaraq, yalnız bütün sətirin başlanğıcı uyğun gəlir, lakin aşağıdakılar da hər bir sətrin əvvəlinə uyğun olacaq. Standart normal ifadələrdə m bayrağına bərabərdir.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']
$
Sətirin sonuna uyğun gəlir. Varsayılan olaraq, bütün sətirin yalnız sonu uyğun gəlir.re.MULTILINE
Bunu qeyd etsəniz, o, hər sətrin sonuna da uyğun olacaq.
result = re.findall('[a-z]+$', s)
print(result)
# ['zzz']
result = re.findall('[a-z]+$', s, flags=re.MULTILINE)
print(result)
# ['xxx', 'yyy', 'zzz']
Siz az və ya bərabər istifadə edə bilərsiniz.
- daxili bayraq
(?m)
- abbreviatura
re.M
Çoxlu bayraqları təyin edin
|
Eyni anda birdən çox bayrağı aktivləşdirmək istəyirsinizsə, bundan istifadə edin. Daxil edilmiş bayraqlar vəziyyətində, aşağıda göstərildiyi kimi hər simvoldan sonra hərf gəlməlidir.(?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']
Acgöz və acgöz olmayan matçlar
Bu, normal ifadələrlə bağlı ümumi problemdir, sadəcə Python ilə bağlı problem deyil, amma bu barədə yazacam, çünki bu, məni problemə salır.
Varsayılan olaraq, aşağıdakı mümkün olan ən uzun sətirə uyğun gələn acgöz uyğunluqdur.
*
+
?
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
? sonra mümkün olan ən qısa sətirə uyğun gələn acgöz, minimal uyğunluqla nəticələnəcək.
*?
+?
??
m = re.match(r'.+?com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(m.group())
# aaa@xxx.com
Qeyd edək ki, standart acgöz uyğunluq gözlənilməz sətirlərə uyğun ola bilər.