-
Notifications
You must be signed in to change notification settings - Fork 0
/
duzenli-ifadeler-gruplar.html
444 lines (368 loc) · 43 KB
/
duzenli-ifadeler-gruplar.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
<!DOCTYPE html>
<html lang="en" prefix="og: http://ogp.me/ns#">
<head>
<link href="http://gmpg.org/xfn/11" rel="profile">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- Metadata -->
<meta name="description" content="3D Modelleme, Animasyon, Render, Vektör - Raster Grafik İşleme ve Python ile Programlama konularına meraklı Açık Kaynak Hayranı bir Makine Mühendisi">
<meta property="og:description" content="3D Modelleme, Animasyon, Render, Vektör - Raster Grafik İşleme ve Python ile Programlama konularına meraklı Açık Kaynak Hayranı bir Makine Mühendisi">
<meta property="og:title" content="Düzenli İfadeler - Gruplar" />
<meta property="og:type" content="article" />
<meta property="og:url" content="/duzenli-ifadeler-gruplar.html" />
<meta property="og:image" content="/images/avatar.png" />
<!-- Enable responsiveness on mobile devices-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>mhalil - Programlama ve 3D</title>
<!-- CSS -->
<link href="//fonts.googleapis.com/" rel="dns-prefetch">
<link href="//fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic|Abril+Fatface|PT+Sans:400,400italic,700&subset=latin,latin-ext" rel="stylesheet">
<link rel="stylesheet" href="/theme/css/poole.css" />
<link rel="stylesheet" href="/theme/css/hyde.css" />
<link rel="stylesheet" href="/theme/css/syntax.css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/fork-awesome.min.css" crossorigin="anonymous">
<!-- Feeds -->
<!-- Analytics -->
</head>
<body class="theme-base-0c">
<div class="sidebar">
<div class="container sidebar-sticky">
<div class="sidebar-about">
<h1>
<a href="/">
<img class="profile-picture" src="/images/avatar.png">
mhalil
</a>
</h1>
<p class="lead"></p>
<p class="lead">3D Modelleme, Animasyon, Render, Vektör - Raster Grafik İşleme ve Python ile Programlama konularına meraklı Açık Kaynak Hayranı bir Makine Mühendisi </p>
<p></p>
</div>
<ul class="sidebar-nav">
<li><a href="/archives.html">Arşiv</a></li>
<li><a href="/categories.html">Kategoriler</a></li>
<li><a href="/tags.html">Etiketler</a></li>
<li><a href="/pages/blender.html">Blender</a></li>
<li><a href="/pages/freecad.html">FreeCAD</a></li>
<li><a href="/pages/librecad.html">LibreCAD</a></li>
<li><a href="/pages/python.html">Python</a></li>
<li><a href="/pages/solvespace.html">Solvespace</a></li>
</ul>
<nav class="sidebar-social">
<a class="sidebar-social-item" href="https://twitter.com/AcikKaynakci" target="_blank">
<i class="fa fa-twitter"></i>
</a>
<a class="sidebar-social-item" href="https://www.artstation.com/mustafahalil" target="_blank">
<i class="fa fa-artstation"></i>
</a>
<a class="sidebar-social-item" href="https://github.com/mhalil" target="_blank">
<i class="fa fa-github"></i>
</a>
<a class="sidebar-social-item" href="/">
<i class="fa fa-rss"></i>
</a>
</nav>
<p class="sidebar-footer">İlmin zekatı %100'dür. Bildiklerizi paylaşın.</p>
</div>
</div> <div class="content container">
<div class="post">
<h1 class="post-title">Düzenli İfadeler - Gruplar</h1>
<span class="post-date">Cts 30 Aralık 2023</span>
<h1># Gruplama, Etikeleme ve Özellikler</h1>
<h2>group() metodu</h2>
<p>Bu bölümde doğrudan düzenli ifadelerin değil, ama düzenli ifadeler kullanılarak üretilen eşleşme nesnelerinin bir metodu olan <code>group()</code> metodundan bahsedeceğiz. </p>
<p>Düzenli ifadelerde parantez içine alınan bölümler grup olarak adlandırılır. <code>group()</code> metodu, bir eşleşme nesnesi üzerinde çağrıldığında, bu <strong>eşleşmenin içindeki belirli bir grupla eşleşen alt dizeyi döndürür</strong>. <code>group()</code> <strong>metodu</strong>, <strong>bir</strong> <code>re.Match</code> <strong>nesnesinin belirli bir grup içindeki eşleşmeyi almak için kullanılır.</strong> <code>re.findall()</code> <strong>metodu</strong>, <code>re.Match</code> <strong>nesnelerini döndürmez; bu nedenle</strong> <code>group()</code> <strong>metodu</strong> <code>re.findall()</code> <strong>ile doğrudan kullanılamaz.</strong> Düzenli ifade içinde parantezle gruplandırılmış alt ifadeler, gruplar oluşturur ve bu gruplara, eşleşen metni belirli bir düzenleme tabi tutarak erişebiliriz. Esasında biz bu metodu önceki bölümlerde de kullanmıştık. Ama burada bu metoda biraz daha ayrıntılı olarak bakacağız.</p>
<p>Daha önceki bölümlerden hatırlayacağınız gibi, bu metot düzenli ifadeleri kullanarak eşleştirdiğimiz karakter dizilerini görme imkanı sağlıyordu. Bu bölümde bu metodu <code>( )</code> metakarakteri yardımıyla daha verimli bir şekilde kullanacağız. İsterseniz ilk olarak şöyle basit bir örnek verelim:</p>
<div class="highlight"><pre><span></span><code><span class="n">kardiz</span> <span class="o">=</span> <span class="s2">"python bir programlama dilidir"</span>
<span class="n">nesne</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"(python) (bir) (programlama) (dilidir)"</span><span class="p">,</span> <span class="n">kardiz</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">nesne</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>python bir programlama dilidir
</code></pre></div>
<p>Burada düzenli ifade kalıbımızı nasıl grupladığımıza dikkat edin. <code>print(nesne.group())</code> komutunu verdiğimizde eşleşen karakter dizileri ekrana döküldü. Şimdi bu grupladığımız bölümlere tek tek erişelim:</p>
<div class="highlight"><pre><span></span><code><span class="n">nesne</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>'python bir programlama dilidir'
</code></pre></div>
<p>Gördüğünüz gibi, “0” indeksi eşleşen karakter dizisinin tamamını veriyor. Gerisinin nasıl olacağını tahmin edebilirsiniz:</p>
<div class="highlight"><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="n">nesne</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="n">nesne</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="n">nesne</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="n">nesne</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>python
bir
programlama
dilidir
</code></pre></div>
<p>Düzenli ifadelerde parantez içine alınan bölümler grup olarak adlandırıldığını ifade etmiştik. Örneğin, <code>(\d+)-(\d+)</code> deseni, iki sayıyı tire ile ayıran bir grup içerir. Bir eşleşme gerçekleştiğinde, bu gruplara erişmek için <code>group()</code> metodu kullanılır.</p>
<p>İşte bir örnek:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"2023-02-14"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'(\d+)-(\d+)-(\d+)'</span><span class="p">)</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="c1"># Tam eşleşen metni alır</span>
<span class="n">full_match</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">full_match</span><span class="p">)</span> <span class="c1"># 2023-02-14</span>
<span class="c1"># Grupları alır</span>
<span class="n">group1</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">group2</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">group3</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">group1</span><span class="p">)</span> <span class="c1"># 2023</span>
<span class="nb">print</span><span class="p">(</span><span class="n">group2</span><span class="p">)</span> <span class="c1"># 02</span>
<span class="nb">print</span><span class="p">(</span><span class="n">group3</span><span class="p">)</span> <span class="c1"># 14</span>
</code></pre></div>
<p>Bu örnekte, <code>(\d+)-(\d+)-(\d+)</code> deseni ile <code>2023-02-14</code> metni eşleştirilir. <code>group()</code> metodu, tam eşleşen metni (<code>2023-02-14</code>) veya belirli grupları (grup 1, grup 2, grup 3) almak için kullanılır.</p>
<p>Eğer eşleşme gerçekleşmemişse veya belirli bir grup mevcut değilse, <code>group()</code> metodu <code>None</code> değerini döndürür. Bu nedenle, kullanmadan önce eşleşmenin gerçekleşip gerçekleşmediğini kontrol etmek önemlidir.</p>
<div class="highlight"><pre><span></span><code><span class="k">if</span> <span class="n">match</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Eşleşme bulunamadı."</span><span class="p">)</span>
</code></pre></div>
<p>Bu kontrol, eşleşme gerçekleşip gerçekleşmediğini kontrol etmede yardımcı olacaktır.</p>
<p><code>group()</code> metoduna ait benzer bir örnek <strong>( ) Parantez</strong> metakarakter başlığı altında ilgili sayfada detaylı anlatıldı.</p>
<h2>groups() metodu</h2>
<p>Bu metot, bize kullanabileceğimiz bütün grupları bir <em>demet</em> halinde sunar:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">kardiz</span> <span class="o">=</span> <span class="s2">"python bir programlama dilidir"</span>
<span class="n">nesne</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"(python) (bir) (programlama) (dilidir)"</span><span class="p">,</span> <span class="n">kardiz</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">nesne</span><span class="o">.</span><span class="n">groups</span><span class="p">())</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>('python', 'bir', 'programlama', 'dilidir')
</code></pre></div>
<h2>Grupları Etiketleme</h2>
<p>Gruplama, bu desenler içindeki alt örüntüleri belirlemek ve bu gruplara etiketler eklemek için kullanışlı bir özelliktir. Bu bölüme kadar yaptığımız örneklerde, düzenli ifadeler ile desen oluşturup, oluşturduğumuz gruplara <strong>group(1), group(2)</strong>, ...vb şekilde eriştik. Yani sürekli aşağıdaki şekilde örnekler verdik;</p>
<h3>Gruplama ve Parantez Kullanımı</h3>
<p>Gruplama, bir desen içinde belirli bir alt örüntüyü tanımlamak ve bu örüntüyü daha sonra referans almak için kullanılır. Gruplama için parantez <code>()</code> kullanılır. Örneğin:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"John Doe, Jane Smith"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'(\w+) (\w+)'</span><span class="p">)</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">if</span> <span class="n">match</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Tam eşleşme:"</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Ad:"</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Soyad:"</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
</code></pre></div>
<p>Bu örnekte, <code>(\w+) (\w+)</code> deseni içindeki her iki kelimeyi gruplamak için parantez kullanılmıştır. <code>match.group(1)</code> ifadesi, desen içindeki ilk parantez içindeki örüntüye eşleşen kısmı döndürür.</p>
<div class="highlight"><pre><span></span><code><span class="n">Tam</span> <span class="n">eşleşme</span><span class="p">:</span> <span class="n">John</span> <span class="n">Doe</span>
<span class="n">Ad</span><span class="p">:</span> <span class="n">John</span>
<span class="n">Soyad</span><span class="p">:</span> <span class="n">Doe</span>
</code></pre></div>
<h3>(?P<...> ile Etiketleme ile Gruplama</h3>
<p>Desen içinde gruplama yaparken, gruplara etiket eklemek, grupları daha anlamlı hale getirmek ve daha sonra bu etiketleri kullanmak için faydalıdır. Etiketleme, <code>?P<etiket></code> sözdizimi ile yapılır. <code>P</code> harfi <code>Placeholder</code>'ın (Yer Tutucu'nun) kısalmasıdır. Örneğin:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"John Doe, Jane Smith"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'(?P<ad>\w+) (?P<soyad>\w+)'</span><span class="p">)</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">if</span> <span class="n">match</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Tam eşleşme:"</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Ad:"</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'ad'</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Soyad:"</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'soyad'</span><span class="p">))</span>
</code></pre></div>
<p>Bu örnekte, <code>(?P<ad>\w+) (?P<soyad>\w+)</code> deseni içindeki her iki kelimeyi etiketleme kullanılarak gruplamıştır. <code>match.group('ad')</code> ve <code>match.group('soyad')</code> ifadeleri, etiketleme sayesinde gruplara erişimi sağlar.</p>
<div class="highlight"><pre><span></span><code>Tam eşleşme: John Doe
Ad: John
Soyad: Doe
</code></pre></div>
<p>Etiketleme, özellikle karmaşık desenler içinde belirli alt örüntülerin anlamını artırmak ve kodun daha okunabilir olmasını sağlamak için kullanışlıdır.</p>
<p>Bir örnek daha yapalım;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"""</span>
<span class="s2">1234567890</span>
<span class="s2">533-456-7891</span>
<span class="s2">544 456 7892</span>
<span class="s2">(216) 456-7893</span>
<span class="s2">"""</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\(?(\d</span><span class="si">{3}</span><span class="s2">)\)?[ \-]?(\d</span><span class="si">{3}</span><span class="s2">)[ |-]?(\d</span><span class="si">{4}</span><span class="s2">)"</span><span class="p">)</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">:</span>
<span class="n">operator</span><span class="p">,</span> <span class="n">üçhane</span><span class="p">,</span> <span class="n">dorthane</span> <span class="o">=</span> <span class="n">match</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Operator: </span><span class="si">{</span><span class="n">operator</span><span class="si">}</span><span class="s2">, Üçhane: </span><span class="si">{</span><span class="n">üçhane</span><span class="si">}</span><span class="s2">, Dorthane: </span><span class="si">{</span><span class="n">dorthane</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</code></pre></div>
<p>Çıktı;</p>
<div class="highlight"><pre><span></span><code><span class="n">Operator</span><span class="p">:</span> <span class="mi">123</span><span class="p">,</span> <span class="n">Üçhane</span><span class="p">:</span> <span class="mi">456</span><span class="p">,</span> <span class="n">Dorthane</span><span class="p">:</span> <span class="mi">7890</span>
<span class="n">Operator</span><span class="p">:</span> <span class="mi">533</span><span class="p">,</span> <span class="n">Üçhane</span><span class="p">:</span> <span class="mi">456</span><span class="p">,</span> <span class="n">Dorthane</span><span class="p">:</span> <span class="mi">7891</span>
<span class="n">Operator</span><span class="p">:</span> <span class="mi">544</span><span class="p">,</span> <span class="n">Üçhane</span><span class="p">:</span> <span class="mi">456</span><span class="p">,</span> <span class="n">Dorthane</span><span class="p">:</span> <span class="mi">7892</span>
<span class="n">Operator</span><span class="p">:</span> <span class="mi">216</span><span class="p">,</span> <span class="n">Üçhane</span><span class="p">:</span> <span class="mi">456</span><span class="p">,</span> <span class="n">Dorthane</span><span class="p">:</span> <span class="mi">7893</span>
</code></pre></div>
<p>Sadece Operatör numaralarını öğrenmek istersek;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"""</span>
<span class="s2">1234567890</span>
<span class="s2">533-456-7891</span>
<span class="s2">544 456 7892</span>
<span class="s2">(216) 456-7893</span>
<span class="s2">"""</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"\(?(\d</span><span class="si">{3}</span><span class="s2">)\)?[ \-]?(\d</span><span class="si">{3}</span><span class="s2">)[ |-]?(\d</span><span class="si">{4}</span><span class="s2">)"</span><span class="p">)</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">:</span>
<span class="n">operator</span><span class="p">,</span> <span class="n">üçhane</span><span class="p">,</span> <span class="n">dorthane</span> <span class="o">=</span> <span class="n">match</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Operator: </span><span class="si">{</span><span class="n">operator</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</code></pre></div>
<p>Çıktı;</p>
<div class="highlight"><pre><span></span><code><span class="n">Operator</span><span class="p">:</span> <span class="mi">123</span>
<span class="n">Operator</span><span class="p">:</span> <span class="mi">533</span>
<span class="n">Operator</span><span class="p">:</span> <span class="mi">544</span>
<span class="n">Operator</span><span class="p">:</span> <span class="mi">216</span>
</code></pre></div>
<p>Son Örnek te tarihle alakalı olsun;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">tarihler</span> <span class="o">=</span> <span class="s2">"""</span>
<span class="s2">30/04/2023</span>
<span class="s2">01-03-2021</span>
<span class="s2">02.22.2019</span>
<span class="s2">11.01.17</span>
<span class="s2">"""</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">"(?P<gun>\d</span><span class="si">{2}</span><span class="s2">)([\/\-\.])(?P<ay>\d</span><span class="si">{2}</span><span class="s2">)([\/\-\.])(?P<yil>\d{2,4})"</span><span class="p">)</span>
<span class="n">matches</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">tarihler</span><span class="p">)</span>
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">:</span>
<span class="n">gun</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">ay</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">yil</span> <span class="o">=</span> <span class="n">match</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Gun: </span><span class="si">{</span><span class="n">gun</span><span class="si">}</span><span class="s2">, Ay: </span><span class="si">{</span><span class="n">ay</span><span class="si">}</span><span class="s2">, Yil: </span><span class="si">{</span><span class="n">yil</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</code></pre></div>
<p>Çıktı;</p>
<div class="highlight"><pre><span></span><code><span class="n">Gun</span><span class="p">:</span> <span class="mi">30</span><span class="p">,</span> <span class="n">Ay</span><span class="p">:</span> <span class="mi">04</span><span class="p">,</span> <span class="n">Yil</span><span class="p">:</span> <span class="mi">2023</span>
<span class="n">Gun</span><span class="p">:</span> <span class="mi">01</span><span class="p">,</span> <span class="n">Ay</span><span class="p">:</span> <span class="mi">03</span><span class="p">,</span> <span class="n">Yil</span><span class="p">:</span> <span class="mi">2021</span>
<span class="n">Gun</span><span class="p">:</span> <span class="mi">02</span><span class="p">,</span> <span class="n">Ay</span><span class="p">:</span> <span class="mi">22</span><span class="p">,</span> <span class="n">Yil</span><span class="p">:</span> <span class="mi">2019</span>
<span class="n">Gun</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span> <span class="n">Ay</span><span class="p">:</span> <span class="mi">01</span><span class="p">,</span> <span class="n">Yil</span><span class="p">:</span> <span class="mi">17</span>
</code></pre></div>
<h1>Lookahead (İleriye bak)</h1>
<p><strong>Lookahead</strong>, düzenli ifadelerde kullanılan bir özelliktir ve <strong>bir eşleşmeyi sınırlamak veya filtrelemek için kullanılır</strong>. Lookahead, bir düzenli ifade içinde belirli bir deseni kontrol etmek ve ardından bir eşleşme oluşturmak için kullanılır, ancak bu kontrolün sonucu eşleşme sonucuna dahil edilmez. Lookahead için <code>?</code> işareti, ile başlayan düzenli ifadeler kullanılır.</p>
<p>Lookahead iki türde gelir: <strong>pozitif lookahead</strong> ve <strong>negatif lookahead</strong>.</p>
<h2>(?= ...) Pozitif Lookahead</h2>
<p><strong>Bir eşleşme sadece belirli bir desenin arkasında varsa</strong> gerçekleşir. Ancak, bu desen eşleşmenin sonucuna dahil edilmez.</p>
<p>Örneğin:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"apple orange banana"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'\w+(?=\sorange)'</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'apple'</span><span class="p">]</span>
</code></pre></div>
<p>Bu örnekte, <code>\w+(?=\sorange)</code> deseni, boşluk karakteri (<code>\s</code>) ile ayrılmış olarak "<strong>orange</strong>" kelimesinden önce gelen kelimeyi eşleştirir.</p>
<p>Bir başka örneğe bakalım;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"quantity and qrcode is really useful"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"q(?=u)[a-zA-Z0-0]+"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'quantity'</span><span class="p">]</span>
</code></pre></div>
<p>Bu desenin açıklaması, <strong>q</strong> ile başlayıp <strong>u</strong> ile devam eden kelime grubunu seç demektir.</p>
<p>Yine aynı metinden yola çıkarak <strong>u</strong> ile devam eden karakterleri <strong>seç</strong> demek istersek;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"quantity and qrcode is really useful"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">".(?=u)"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<p>bu bize <strong>q</strong> , <strong>boşluk</strong> ve <strong>f</strong> karakterlerini seçecektir.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'q'</span><span class="p">,</span> <span class="s1">' '</span><span class="p">,</span> <span class="s1">'f'</span><span class="p">]</span>
</code></pre></div>
<p>Bir örnek daha yapalım;</p>
<p>"The fat cat ran down the street. rere" ifadesinden <strong>at</strong> ile <strong>devam eden</strong> karakterleri seç demek istersek;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"The fat cat ran down the street. rere"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">".(?=at)"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<p>bu ifade bize <strong>f</strong> ve <strong>c</strong> karakterlerini verir. Çünkü cümle içerisinde <strong>at</strong> ile devam eden sadece <strong>fat</strong> ve <strong>cat</strong> vardır.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'f'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">]</span>
</code></pre></div>
<h2>(?! ...) Negatif Lookahead</h2>
<p><strong>Bir eşleşme, belirli bir desenin arkasında yoksa</strong> gerçekleşir. Yani belirlediğimiz karakter ile devam etmeyen ifadeleri seçer. </p>
<p>Örneğin:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"apple orange banana"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'\w+(?!\sorange)'</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'appl'</span><span class="p">,</span> <span class="s1">'orange'</span><span class="p">,</span> <span class="s1">'banana'</span><span class="p">]</span>
</code></pre></div>
<p>Bu örnekte, <code>\w+(?!\sorange)</code> deseni, boşluk karakteri (<code>\s</code>) ile ayrılmış olarak "<strong>orange</strong>" kelimesinden önce gelmeyen kelimeyi eşleştirir. Çıktıdaki<code>appl</code> kelimesinde <code>e</code>harfinin <strong>olmadığına</strong> dikkat edin.</p>
<p>Bir diğer örnek;</p>
<p>"quantity and qrcode is really useful" metninde, <strong>q</strong> ile başlayıp <strong>u</strong> ile devam etmeyen bir ifadeyi seçmek istersek;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"quantity and qrcode is really useful"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"q(?!u)[a-zA-Z0-9]+"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<p>Burada <strong>q</strong> ile başlayıp <strong>u</strong> ile devam etmeyen kelime grubunu seçer. [a-zA-Z0-9] ile herhangi bir karakteri gidebildiği karar seçmesini sagladik bu bize <strong>qrcode</strong> kelimesini geri döndürecektir.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'qrcode'</span><span class="p">]</span>
</code></pre></div>
<p>Eğer bu ifadeyi <strong>u</strong> yerine <strong>r</strong> ile değiştirirsek yani <strong>q</strong> ile başlayıp <strong>r</strong> ile devam <strong>etmeyen</strong> kelime grubunu seç dersek bu durumda <strong>quantity</strong> seçilecektir;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"quantity and qrcode is really useful"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"q(?!r)[a-zA-Z0-9]+"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'quantity'</span><span class="p">]</span>
</code></pre></div>
<p>Lookahead, daha karmaşık eşleşme şartlarını ifade etmek ve belirli durumları kontrol etmek için kullanışlıdır. Ancak, düzenli ifadelerin anlaşılması ve kullanılması bazen karmaşık olabilir, bu nedenle dikkatlice kullanılmalıdır.</p>
<h1>Look Behind (geriye bak)</h1>
<p>Öncesinde belirlediğimiz karakter ya da karakter gruplarıyla <strong>devam eden</strong> ya da <strong>devam etmeyen</strong> ifadeleri seçmemizi sağlar. <strong>Lookbehind</strong>’ lar bir ifadeden önce başka bir ifade olup olmadığını kontrol etmek için kullanılır. Lookbehind için <code>?<</code> işareti ile başlayan düzenli ifadeler kullanılır.</p>
<p><code>Lookbehind</code> (geriye bak) düzenli ifade özelliği, bir eşleşmenin gerçekleşebilmesi için önceki bir desenin arkasında belirli bir desenin bulunmasını kontrol etmeye yarar. <code>Lookbehind</code> özelliği, bir eşleşmenin önceki bir deseni içermesi gerektiğinde kullanılır ancak bu deseni eşleşmenin bir parçası olarak almaz.</p>
<p><code>Lookbehind</code> iki türdedir: <strong>pozitif lookbehind</strong> <code>(?<=...)</code> ve <strong>negatif lookbehind</strong> <code>(?<!...)</code>.</p>
<h2>(?<=...) Pozitif Lookbehind</h2>
<p>Bir eşleşme, <strong>belirli bir desenin önceki bir desenin arkasında varsa</strong> gerçekleşir.</p>
<p>Örneğin:</p>
<p>Bu örnekte, <code>(?<=\s)orange</code> deseni, boşluk karakteri (<code>\s</code>) ile ayrılmış olarak "orange" <strong>kelimesinden</strong> önce gelen kelimeyi eşleştirir.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'orange'</span><span class="p">]</span>
</code></pre></div>
<p>Bir başka örneğe bakalım;</p>
<p>"<strong>quantity and qrcode is really unuseful but this is an unethical</strong>" cümlesinde <strong>un</strong> ile başlayan karakterleri seçelim.</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"quantity and qrcode is really unuseful but this is an unethical"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"(?<=un)."</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<p>eşleşme sadece un<strong>u</strong>seful ve un<strong>e</strong>thical kelimelerde gerçekleşecek ve <strong>u</strong> ile <strong>e</strong> karakterlerini verecektir. Çünkü öncesinde <strong>un</strong> karakterleri bulunmaktadır.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'u'</span><span class="p">,</span> <span class="s1">'e'</span><span class="p">]</span>
</code></pre></div>
<p>Farklı bir örnek;</p>
<p>"<strong>quantity and qrcode is really unuseful but this is an unethical. The punisher was born in early age. Also the man is really old</strong>" cümlesinde almak istediğimiz kelimeler <strong>punisher</strong> ve <strong>man</strong> kelimeleri olsaydı. Bunun öncesinde "The" var mı? yok mu? diye kontrol edebilirdik. Diğer bir bakış açısı ise "The"" veya "the" ile başlayan kelimeleri bana nasıl getirebilirdik? olabilir. Bunun için;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">metin</span> <span class="o">=</span> <span class="s2">"quantity and qrcode is really unuseful but this is an unethical. The punisher was born in early age. Also the man is really old"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"(?<=[tT]he )[a-zA-Z]+"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<p><code>(?<=[tT]he )[a-zA-Z]+</code> ifadesi bizim için yeterli olacaktır. Çünkü The ya da the bizim seçmek istediğimiz iki farklı kelime olduğu için burada <strong>T</strong> veya <strong>t</strong> opsiyonel olmalıdır. Bu ifade bize şunu <strong>punisher</strong> ve <strong>man</strong> kelimelerini verecektir.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'punisher'</span><span class="p">,</span> <span class="s1">'man'</span><span class="p">]</span>
</code></pre></div>
<h2>(?<!...) Negatif Lookbehind</h2>
<p><strong>Pozitif lookbehind</strong>'ın tam tersidir. Belirtilen ifade ile başlamayan ifadeleri kontrol etmek için kullanılır. <code>(?<!ifade)</code> şeklinde kullanılır. </p>
<p>Örneğin; a harfinden önce b harfi olmayan bütün ifadeleri yakala demek için <code>(?<!b)a</code> ifadesi kullanılır.</p>
<p>Örnek:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"orange1 apple orange2 banana"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'(?<!\s)orange.'</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'orange1'</span><span class="p">]</span>
</code></pre></div>
<p>Bu örnekte, <code>(?<!\s)orange</code> deseni, boşluk karakteri (<code>\s</code>) ile ayrılmış olarak "<strong>orange</strong>" kelimesinden önce gelmeyen "<strong>orange</strong>" kelimesini eşleştirir.</p>
<p>Bir diğer örneğe bakalım;</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"pie, apple, orange juice, banana split"</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'(?<!\s)pie'</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="s1">'pie'</span><span class="p">]</span>
</code></pre></div>
<p>Bu örnekte, <code>(?<!\s)pie</code> deseni, boşluk karakteri (<code>\s</code>) ile ayrılmamış olarak "<strong>pie</strong>" kelimesini eşleştirir. Yani, eğer "<strong>pie</strong>" kelimesi bir boşluk karakteri ile başlamıyorsa, bu kelimeyi eşleştirir. <code>pie</code> kelimesi burada <code>orange juice</code> içindeki <code>pie</code> kelimesine eşleşir, çünkü onun önünde bir boşluk karakteri yok.</p>
<p><code>Lookbehind</code> özelliği, belirli bir desenin önceki bir deseni kontrol etmek için kullanılır ve eşleşmenin gerçekleşmesini sınırlar. Ancak, Python'da kullanılan bazı diğer programlama dillerinde olduğu gibi, <code>Lookbehind</code> özelliği tamamen genişletilmiş (fixed-width) desenlere izin vermez; yani, lookbehind deseni bir değişken uzunluktaysa hata alabilirsiniz.</p>
<h3>Kaynaklar:</h3>
<ul>
<li>
<p><a href="https://github.com/gkandemi/regex">gkandemi/regex: Düzenli ifadeler</a></p>
</li>
<li>
<p><a href="https://chat.openai.com/">ChatGPT</a></p>
</li>
</ul>
</div>
</div>
</body>
</html>