Python’da Düzenli İfadeler (RegEx)
Bu öğreticide, düzenli ifadeler (RegEx) hakkında bilgi edinecek ve RegEx ile çalışmak için Python’un re modülünü kullanacaksınız (örneklerin yardımıyla).
Normal İfade ( RegEx ), bir arama modelini tanımlayan bir karakter dizisidir. Örneğin,
1 | ^a...s$ |
Yukarıdaki kod bir RegEx kalıbı tanımlar. Kalıp şu şekildedir: ile başlayan herhangi bir beş harfli dizeave ile bitens.
RegEx kullanılarak tanımlanan bir kalıp, bir dizeyle eşleştirmek için kullanılabilir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
^a...s$ | abs | eşleşme yok |
alias | Kibrit | |
abyss | Kibrit | |
Alias | eşleşme yok | |
An abacus | eşleşme yok |
re
Python, RegEx ile çalışmak üzere adlandırılmış bir modüle sahiptir . İşte bir örnek:
1 2 3 4 5 6 7 8 9 10 11 | import re pattern = '^a...s$' test_string = 'abyss' result = re.match(pattern, test_string) if result: print("Search successful.") else: print("Search unsuccessful.") |
Burada, re.match()
arama yapmak için işlevi kullandıkmodeliçindetest_string. Arama başarılı olursa, yöntem bir eşleşme nesnesi döndürür. Değilse, döner None
.
içinde tanımlanmış başka birkaç fonksiyon vardır.tekrarRegEx ile çalışmak için modül. Bunu keşfetmeden önce, düzenli ifadelerin kendilerini öğrenelim.
RegEx’in temellerini zaten biliyorsanız, Python RegEx’e atlayın .
RegEx Kullanarak Desen Belirtin
Normal ifadeleri belirtmek için meta karakterler kullanılır. Yukarıdaki örnekte ^
ve $
meta karakterlerdir.
Meta Karakterler
Meta karakterler, bir RegEx motoru tarafından özel bir şekilde yorumlanan karakterlerdir. İşte meta karakterlerin bir listesi:
[] . ^ $ * + ? {} () \ |
[]
– Köşeli parantez
Köşeli parantezler, eşleştirmek istediğiniz bir dizi karakteri belirtir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
[abc] | a | 1 maç |
ac | 2 maç | |
Hey Jude | eşleşme yok | |
abc de ca | 5 maç |
Burada, [abc]
eşleştirmeye çalıştığınız dize a
, b
veya öğelerinden herhangi birini içeriyorsa eşleşir c
.
-
Köşeli parantezler içinde bir dizi karakter de belirtebilirsiniz .
[a-e]
ile aynıdır[abcde]
.[1-4]
ile aynıdır[1234]
.[0-39]
ile aynıdır[01239]
.
^
Köşeli parantezin başında düzeltme işareti simgesini kullanarak karakter kümesini tamamlayabilirsiniz (ters çevirebilirsiniz) .
[^abc]
dışında herhangi bir karakter anlamına geliraveyabveyac.[^0-9]
herhangi bir rakam olmayan karakter anlamına gelir.
.
– Dönem
Nokta, herhangi bir tek karakterle eşleşir (yeni satır hariç '\n'
).
İfade | Sicim | Eşleşti mi? |
---|---|---|
.. | a | eşleşme yok |
ac | 1 maç | |
acd | 1 maç | |
acde | 2 eşleşme (4 karakter içerir) |
^
– Şapka
Düzeltme işareti , bir dizenin belirli bir karakterle başlayıp başlamadığını^
kontrol etmek için kullanılır .
İfade | Sicim | Eşleşti mi? |
---|---|---|
^a | a | 1 maç |
abc | 1 maç | |
bac | eşleşme yok | |
^ab | abc | 1 maç |
acb | Eşleşme yok ( ile başlar a ancak devamında gelmez b ) |
$
– Dolar
Dolar sembolü , bir dizenin belirli bir karakterle bitip bitmediğini$
kontrol etmek için kullanılır .
İfade | Sicim | Eşleşti mi? |
---|---|---|
a$ | a | 1 maç |
formula | 1 maç | |
cab | eşleşme yok |
*
– Yıldız
Yıldız sembolü , kendisine bırakılan desenin sıfır veya daha fazla tekrarı*
ile eşleşir .
İfade | Sicim | Eşleşti mi? |
---|---|---|
ma*n | mn | 1 maç |
man | 1 maç | |
maaan | 1 maç | |
main | Eşleşme yok ( a takip etmez n ) | |
woman | 1 maç |
+
– Artı
Artı sembolü , kendisine bırakılan desenin bir veya daha fazla tekrarı+
ile eşleşir .
İfade | Sicim | Eşleşti mi? |
---|---|---|
ma+n | mn | Eşleşme yok ( a karakter yok) |
man | 1 maç | |
maaan | 1 maç | |
main | Eşleşme yok (a’nın ardından n gelmez) | |
woman | 1 maç |
?
– Soru İşareti
Soru işareti sembolü , kendisine bırakılan örüntünün sıfır veya bir tekrarı?
ile eşleşir .
İfade | Sicim | Eşleşti mi? |
---|---|---|
ma?n | mn | 1 maç |
man | 1 maç | |
maaan | Eşleşme yok (birden fazla a karakter) | |
main | Eşleşme yok (a’nın ardından n gelmez) | |
woman | 1 maç |
{}
– Diş telleri
Bu kodu göz önünde bulundurun: {n,m}
. Bu, en azındann, ve en fazlamkendisine bırakılan desenin tekrarları.
İfade | Sicim | Eşleşti mi? |
---|---|---|
a{2,3} | abc dat | eşleşme yok |
abc daat | 1 maç ( ‘de )daat | |
aabc daaat | 2 maç ( aabc ve )daaat | |
aabc daaaat | 2 maç ( aabc ve )daaaat |
Bir örnek daha deneyelim. Bu RegEx [0-9]{2, 4}
, en az 2 basamakla eşleşir, ancak 4 basamaktan fazla olamaz
İfade | Sicim | Eşleşti mi? |
---|---|---|
[0-9]{2,4} | ab123csde | 1 maç (eşleşme )ab123csde |
12 and 345673 | 3 maç ( 12 , 3456 , 73 ) | |
1 and 2 | eşleşme yok |
|
– Değişim
Dikey çubuk |
, dönüşüm ( or
operatör) için kullanılır.
İfade | Sicim | Eşleşti mi? |
---|---|---|
a|b | cde | eşleşme yok |
ade | 1 maç (eşleşme ade ) | |
acdbea | 3 maç ( ‘de )acdbea |
Burada, a|b
herhangi birini içeren herhangi bir dizeyi eşleştirinaveyab
()
– Grup
Parantezler ()
alt kalıpları gruplamak için kullanılır. Örneğin, (a|b|c)xz
ikisinden biriyle eşleşen herhangi bir dizeyi eşleştirinaveyabveyacbunu takibenxz
İfade | Sicim | Eşleşti mi? |
---|---|---|
(a|b|c)xz | ab xz | eşleşme yok |
abxz | 1 maç (eşleşme )abxz | |
axz cabxz | 2 maç ( ‘de )axzbc cabxz |
\
– Ters eğik çizgi
Boşluk \
, tüm meta karakterler de dahil olmak üzere çeşitli karakterlerden kaçmak için kullanılır. Örneğin,
\$a
bir dize $
ve ardından a
. Burada, $
bir RegEx motoru tarafından özel bir şekilde yorumlanmaz.
Bir karakterin özel bir anlamı olup olmadığından emin değilseniz, \
önüne koyabilirsiniz. Bu, karakterin özel bir şekilde ele alınmamasını sağlar.
Özel Diziler
Özel diziler, yaygın olarak kullanılan kalıpların yazılmasını kolaylaştırır. İşte özel dizilerin bir listesi:
\A
– Belirtilen karakterler bir dizenin başındaysa eşleşir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
\Athe | the sun | Kibrit |
In the sun | eşleşme yok |
\b
– Belirtilen karakterler bir kelimenin başında veya sonundaysa eşleşir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
\bfoo | football | Kibrit |
a football | Kibrit | |
afootball | eşleşme yok | |
foo\b | the foo | Kibrit |
the afoo test | Kibrit | |
the afootest | eşleşme yok |
\B
– karşısında \b
. Belirtilen karakterler bir kelimenin başında veya sonunda değilse eşleşir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
\Bfoo | football | eşleşme yok |
a football | eşleşme yok | |
afootball | Kibrit | |
foo\B | the foo | eşleşme yok |
the afoo test | eşleşme yok | |
the afootest | Kibrit |
\d
– Herhangi bir ondalık basamakla eşleşir. Eşittir[0-9]
İfade | Sicim | Eşleşti mi? |
---|---|---|
\d | 12abc3 | 3 maç ( ‘de )12abc3 |
Python | eşleşme yok |
\D
– Ondalık olmayan herhangi bir rakamla eşleşir. Eşittir[^0-9]
İfade | Sicim | Eşleşti mi? |
---|---|---|
\D | 1ab34"50 | 3 maç ( ‘de )1ab34"50 |
1345 | eşleşme yok |
\s
– Bir dizenin herhangi bir boşluk karakteri içerdiği durumlarda eşleşir. ile eşdeğerdir [ \t\n\r\f\v]
.
İfade | Sicim | Eşleşti mi? |
---|---|---|
\s | Python RegEx | 1 maç |
PythonRegEx | eşleşme yok |
\S
– Bir dizenin boşluk olmayan herhangi bir karakter içerdiği durumlarda eşleşir. ile eşdeğerdir [^ \t\n\r\f\v]
.
İfade | Sicim | Eşleşti mi? |
---|---|---|
\S | a b | 2 maç ( ‘de ) a b |
| eşleşme yok |
\w
– Herhangi bir alfasayısal karakterle (rakamlar ve alfabeler) eşleşir. ile eşdeğerdir [a-zA-Z0-9_]
. Bu arada, alt çizgi _
de alfasayısal bir karakter olarak kabul edilir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
\w | 12&": ;c | 3 maç ( ‘de )12&": ;c |
%"> ! | eşleşme yok |
\W
– Herhangi bir alfasayısal olmayan karakterle eşleşir. Eşittir[^a-zA-Z0-9_]
İfade | Sicim | Eşleşti mi? |
---|---|---|
\W | 1a2%c | 1 maç ( ‘de )1a2%c |
Python | eşleşme yok |
\Z
– Belirtilen karakterler bir dizenin sonundaysa eşleşir.
İfade | Sicim | Eşleşti mi? |
---|---|---|
Python\Z | I like Python | 1 maç |
I like Python Programming | eşleşme yok | |
Python is fun. | eşleşme yok |
İpucu: Normal ifadeler oluşturmak ve test etmek için regex101 gibi RegEx test araçlarını kullanabilirsiniz . Bu araç yalnızca düzenli ifadeler oluşturmanıza yardımcı olmakla kalmaz, aynı zamanda onu öğrenmenize de yardımcı olur.
Artık RegEx’in temellerini anladığınıza göre, Python kodunuzda RegEx’i nasıl kullanacağınızı tartışalım.
Python Normal İfade
re
Python’un düzenli ifadelerle çalışmak üzere adlandırılmış bir modülü vardır . Kullanmak için modülü içe aktarmamız gerekiyor.
1 | import re |
Modül, RegEx ile çalışmak için çeşitli işlevler ve sabitler tanımlar.
yeniden bul()
Yöntem re.findall()
, tüm eşleşmeleri içeren bir dize listesi döndürür.
Örnek 1: re.findall()
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Program to extract numbers from a string import re string = 'hello 12 hi 89. Howdy 34' pattern = '\d+' result = re.findall(pattern, string) print(result) # Output: ['12', '89', '34'] |
Desen bulunamazsa re.findall()
boş bir liste döndürür.
yeniden.split()
Yöntem re.split
, eşleşme olan dizeyi böler ve bölmelerin gerçekleştiği dizelerin bir listesini döndürür.
Örnek 2: yeniden.split()
1 2 3 4 5 6 7 8 9 10 11 | import re string = 'Twelve:12 Eighty nine:89.' pattern = '\d+' result = re.split(pattern, string) print(result) # Output: ['Twelve:', ' Eighty nine:', '.'] |
Kalıp bulunamazsa, re.split()
orijinal dizeyi içeren bir liste döndürür.
Yönteme maxsplit
argüman iletebilirsiniz . re.split()
Gerçekleşecek maksimum bölünme sayısıdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import re string = 'Twelve:12 Eighty nine:89 Nine:9.' pattern = '\d+' # maxsplit = 1 # split only at the first occurrence result = re.split(pattern, string, 1) print(result) # Output: ['Twelve:', ' Eighty nine:89 Nine:9.'] |
Bu arada, varsayılan değeri maxsplit
0’dır; tüm olası bölünmeler anlamına gelir.
yeniden.sub()
Sözdizimi re.sub()
şudur:
1 | re.sub(pattern, replace, string) |
Yöntem, eşleşen oluşumların içeriğiyle değiştirildiği bir dize döndürür.yer değiştirmekdeğişken.
Örnek 3: re.sub()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Program to remove all whitespaces import re # multiline string string = 'abc 12\ de 23 \n f45 6' # matches all whitespace characters pattern = '\s+' # empty string replace = '' new_string = re.sub(pattern, replace, string) print(new_string) # Output: abc12de23f456 |
Desen bulunamazsa, re.sub()
orijinal dizeyi döndürür.
Geçebilirsinsaymakre.sub()
yönteme dördüncü parametre olarak . Atlanırsa, 0 ile sonuçlanır. Bu, tüm oluşumların yerini alacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import re # multiline string string = 'abc 12\ de 23 \n f45 6' # matches all whitespace characters pattern = '\s+' replace = '' new_string = re.sub(r'\s+', replace, string, 1) print(new_string) # Output: # abc12de 23 # f45 6 |
yeniden.subn()
Yeni dizeyi ve yapılan değişiklik sayısını içeren 2 öğelik bir demet döndürmesi dışında şuna re.subn()
benzer .re.sub()
Örnek 4: re.subn()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Program to remove all whitespaces import re # multiline string string = 'abc 12\ de 23 \n f45 6' # matches all whitespace characters pattern = '\s+' # empty string replace = '' new_string = re.subn(pattern, replace, string) print(new_string) # Output: ('abc12de23f456', 4) |
Araştırma()
Yöntem re.search()
iki argüman alır: bir model ve bir dize. Yöntem, RegEx modelinin dizeyle eşleşme ürettiği ilk konumu arar.
Arama başarılı olursa, re.search()
bir eşleşme nesnesi döndürür; değilse geri döner None
.
1 | match = re.search(pattern, str) |
Örnek 5: yeniden arama()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import re string = "Python is fun" # check if 'Python' is at the beginning match = re.search('\APython', string) if match: print("pattern found inside the string") else: print("pattern not found") # Output: pattern found inside the string |
Burada,kibritbir eşleşme nesnesi içerir.
Nesneyi eşleştir
dir() işlevini kullanarak bir eşleşme nesnesinin yöntemlerini ve özniteliklerini alabilirsiniz .
Eşleştirme nesnelerinin yaygın olarak kullanılan yöntem ve özelliklerinden bazıları şunlardır:
maç.grup()
Yöntem group()
, dizenin eşleşmenin olduğu bölümünü döndürür.
Örnek 6: Nesneyi eşleştir
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import re string = '39801 356, 2102 1111' # Three digit number followed by space followed by two digit number pattern = '(\d{3}) (\d{2})' # match variable contains a Match object. match = re.search(pattern, string) if match: print(match.group()) else: print("pattern not found") # Output: 801 35 |
Burada,kibritdeğişken bir eşleşme nesnesi içerir.
Modelimizin (\d{3}) (\d{2})
iki alt grubu vardır (\d{3})
ve (\d{2})
. Bu parantezli alt grupların dizesinin bir kısmını alabilirsiniz. İşte nasıl:
1 2 3 4 5 6 7 8 9 10 11 | >>> match.group(1) '801' >>> match.group(2) '35' >>> match.group(1, 2) ('801', '35') >>> match.groups() ('801', '35') |
match.start(), match.end() ve match.span()
İşlev start()
, eşleşen alt dizenin başlangıcının dizinini döndürür. Benzer şekilde, end()
eşleşen alt dizenin bitiş dizinini döndürür.
1 2 3 4 | >>> match.start() 2 >>> match.end() 8 |
İşlev span()
, eşleşen parçanın başlangıç ve bitiş indeksini içeren bir demet döndürür.
1 2 | >>> match.span() (2, 8) |
match.re ve match.string
Eşleşen bir nesnenin re
özniteliği, bir normal ifade nesnesi döndürür. Benzer şekilde, string
öznitelik iletilen dizeyi döndürür.
1 2 3 4 5 6 | >>> match.re re.compile('(\\d{3}) (\\d{2})') >>> match.string '39801 356, 2102 1111' |
Modülde tanımlanan yaygın olarak kullanılan tüm yöntemleri ele aldık re
. Daha fazlasını öğrenmek istiyorsanız Python 3 re modülünü ziyaret edin .
RegEx’ten önce r önekini kullanma
Ne zamanrveyaRönek normal bir ifadeden önce kullanılır, ham dize anlamına gelir. Örneğin, '\n'
yeni bir satırdır, oysa r'\n'
iki karakter anlamına gelir: bir ters eğik çizgi \
ve ardından n
.
Boşluk \
, tüm meta karakterler de dahil olmak üzere çeşitli karakterlerden kaçmak için kullanılır. Ancak, kullanarakrönek, \
tedaviyi normal bir karakter olarak yapar.
Örnek 7: r öneki kullanan ham dize
1 2 3 4 5 6 7 8 9 | import re string = '\n and \r are escape sequences.' result = re.findall(r'[\n\r]', string) print(result) # Output: ['\n', '\r'] |