-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathduzenli-ifadeler-metakarakterler.html
1074 lines (866 loc) · 116 KB
/
duzenli-ifadeler-metakarakterler.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
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!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 - Metakarakterler" />
<meta property="og:type" content="article" />
<meta property="og:url" content="/duzenli-ifadeler-metakarakterler.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 - Metakarakterler</h1>
<span class="post-date">Cts 02 Eylül 2023</span>
<h1>Metakarakterler (Özel Karakterler)</h1>
<p>Metakarakterler; kabaca, programlama dilleri için özel anlam ifade eden sembollerdir. Örneğin <code>\n</code> bir bakıma bir metakarakterdir, çünkü <code>\n</code> sembolü Python programlama dili için özel bir anlam taşır. Python bu sembolü gördüğü yerde yeni bir satıra geçer. Metakarakterler, <strong>Kendisiyle eşleşmeyen karakterler</strong> olarak ifade edilebilir. Örneğin, <strong>a</strong> harfi yalnızca kendisiyle eşleşir. Tıpkı <strong>istihza</strong> kelimesinin yalnızca kendisiyle eşleşeceği gibi. Ancak mesela <code>\t</code> ifadesi kendisiyle eşleşmez. Python bu işareti gördüğü yerde sekme (tab) düğmesine basılmış gibi tepki verecektir. İşte düzenli ifadelerde de buna benzer metakarakterlerden yararlanacağız. Düzenli ifadeler içinde de, özel anlam ifade eden pek çok sembol, yani metakarakter vardır. Şimdi bu meta karakterleri ayrı ayrı başlıklar altında inceleyelim.</p>
<h2>[] Köşeli Parantez</h2>
<p>İlk inceleyeceğimiz metakarakterlerden biri Köşeli Parantez <code>[ ]</code> sembolüdür.
Python, <strong>köşeli parantez içinde gördüğü bütün karakterleri tek tek liste öğelerine uygular.</strong></p>
<p>Şimdi aşağıdaki listeden <strong>özcan</strong>, <strong>özhan</strong> ve <strong>özkan</strong> öğelerini bu sembolden yararlanarak nasıl ayıklayacağımızı görelim:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"özcan"</span><span class="p">,</span> <span class="s2">"mehmet"</span><span class="p">,</span> <span class="s2">"süleyman"</span><span class="p">,</span> <span class="s2">"selim"</span><span class="p">,</span> <span class="s2">"kemal"</span><span class="p">,</span> <span class="s2">"özkan"</span><span class="p">,</span> <span class="s2">"esra"</span><span class="p">,</span> <span class="s2">"dündar"</span><span class="p">,</span> <span class="s2">"esin"</span><span class="p">,</span> <span class="s2">"esma"</span><span class="p">,</span> <span class="s2">"özhan"</span><span class="p">,</span>
<span class="s2">"özlem"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</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">"öz[chk]an"</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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>özcan
özkan
özhan
</code></pre></div>
<p>Yukarıdaki örnekte, bir liste içinde geçen <strong>özcan</strong>, <strong>özhan</strong> ve <strong>özkan</strong> öğelerini ayıklıyoruz. Burada bu üç öğedeki farklı karakterleri (<strong>c</strong>, <strong>h</strong> ve <strong>k</strong>) köşeli parantez içinde nasıl belirttiğimize dikkat edin. </p>
<p>Python, köşeli parantez içinde gördüğü bütün karakterleri tek tek liste öğelerine uyguluyor. Önce <strong>öz</strong> ile başlayan bütün öğeleri alıyor, ardından <strong>öz</strong> hecesinden sonra <strong>c</strong> harfiyle devam eden ve <strong>an</strong> hecesi ile biten öğeyi buluyor. Böylece <strong>özcan</strong> öğesini bulmuş oldu. </p>
<p>Aynı işlemi, <strong>öz</strong> hecesinden sonra <strong>h</strong> harfini barındıran ve <strong>an</strong> hecesiyle biten öğeye uyguluyor. Bu şekilde ise <strong>özhan</strong> öğesini bulmuş oldu. </p>
<p>En son hedef ise <strong>öz</strong> ile başlayıp <strong>k</strong> harfi ile devam eden ve <strong>an</strong> ile biten öğe. Yani listedeki <strong>özkan</strong> öğesi… En nihayetinde de elimizde <strong>özcan</strong>, <strong>özhan</strong> ve <strong>özkan</strong> öğeleri kalmış oluyor.</p>
<p>Yeni bir örnek ile devam edelim.</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"23BH56"</span><span class="p">,</span><span class="s2">"TY76Z"</span><span class="p">,</span><span class="s2">"4Y7UZ"</span><span class="p">,</span><span class="s2">"TYUDZ"</span><span class="p">,</span><span class="s2">"34534"</span><span class="p">]</span>
</code></pre></div>
<p>Mesela biz bu listedeki öğeler içinde, sayıyla başlayanları ayıklayalım:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"[0-9]"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mf">23</span><span class="n">BH56</span>
<span class="mf">4</span><span class="n">Y7UZ</span>
<span class="mf">34534</span>
</code></pre></div>
<p>Burada parantez içinde kullandığımız ifadeye dikkat edin. <strong>0</strong> ile <strong>9</strong> arasındaki bütün öğeleri içeren bir karakter dizisi tanımladık. Yani kısaca, içinde herhangi bir sayı barındıran öğeleri kapsama alanımıza aldık. Burada ayrıca <code>search()</code> yerine <code>match()</code> metodunu kullandığımıza da dikkat edin. <code>match()</code> metodunu kullanmamızın nedeni, bu metodun bir karakter dizisinin sadece en başına bakması. Amacımız sayı ile başlayan bütün öğeleri ayıklamak olduğuna göre, yukarıda yazdığımız kod, liste öğeleri içinde yer alan ve sayı ile başlayan bütün öğeleri ayıklayacaktır.</p>
<p>Şimdi de isterseniz listedeki <strong>TY76Z</strong> öğesini nasıl alabileceğimize bakalım:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"[A-Z][A-Z][0-9]"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>TY76Z
</code></pre></div>
<p>Burada dikkat ederseniz düzenli ifademizin başında <strong>A-Z</strong> diye bir şey yazdık. Bu ifade “A” ile “Z” harfleri arasındaki bütün karakterleri temsil ediyor. Biz burada yalnızca büyük harfleri sorguladık. Eğer küçük harfleri sorgulamak isteseydik <strong>A-Z</strong> yerine <strong>a-z</strong> diyecektik. </p>
<p>Düzenli ifademiz içinde geçen birinci “A-Z” ifadesi aradığımız karakter dizisi olan “TY76Z” içindeki “T” harfini, ikinci “A-Z” ifadesi “Y” harfini, “0-9” ifadesi ise “7” sayısını temsil ediyor. Karakter dizisi içindeki geri kalan harfler ve sayılar otomatik olarak eşleştirilecektir. O yüzden onlar için ayrı bir şey yazmaya gerek yok. Yalnız bu söylediğimiz son şey sizi aldatmasın. Bu “otomatik eşleştirme” işlemi bizim şu anda karşı karşıya olduğumuz karakter dizisi için geçerlidir. Farklı nitelikteki karakter dizilerinin söz konusu olduğu başka durumlarda işler böyle yürümeyebilir. Düzenli ifadeleri başarılı bir şekilde kullanabilmenin ilk şartı, üzerinde işlem yapılacak karakter dizisini tanımaktır. Bizim örneğimizde yukarıdaki gibi bir düzenli ifade kalıbı oluşturmak işimizi görüyor. Ama başka durumlarda, duruma uygun başka kalıplar yazmak gerekebilir/gerekecektir. Dolayısıyla, tek bir düzenli ifade kalıbıyla hayatın geçmeyeceğini unutmamalıyız.</p>
<p>Bu arada, düzenli ifadelerle ilgili daha fazla şey öğrendiğimizde yukarıdaki kodu çok daha sade bir biçimde yazabileceğiz.</p>
<h2>. Nokta</h2>
<p>Bu metakarakter, <strong>yeni satır karakteri hariç bütün karakterleri temsil etmek için kullanılır.</strong> <code>.</code> metakarakteri, <strong>sadece tek bir karakterin yerini tutar</strong>. Aşağıdaki örneği inceleyelim:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="n">nesne</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"öz.an"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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>özcan
özkan
özhan
</code></pre></div>
<p>Gördüğünüz gibi, daha önce <code>[]</code> metakarakterini kullanarak yazdığımız bir düzenli ifadeyi bu kez farklı şekilde yazıyoruz. Unutmayın, bir düzenli ifade birkaç farklı şekilde yazılabilir. Biz bunlar içinde en basit ve en anlaşılır olanını seçmeliyiz. Ayrıca yukarıdaki kodu birkaç farklı şekilde de yazabilirsiniz. Mesela şu yazım da bizim durumumuzda geçerli bir seçenek olacaktır:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"öz.an"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>özcan
özkan
özhan
</code></pre></div>
<p>Yalnız, unutmamamız gereken şey, bu <code>.</code> adlı metakarakterin sadece tek bir karakterin yerini tutuyor olmasıdır. Yani şöyle bir kullanım bize istediğimiz sonucu vermez:</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"ahmet"</span><span class="p">,</span><span class="s2">"kemal"</span><span class="p">,</span> <span class="s2">"kamil"</span><span class="p">,</span> <span class="s2">"mehmet"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">".met"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<p>Burada <code>.</code> sembolü “ah” ve “meh” hecelerinin yerini tutamaz. <code>.</code> sembolünün görevi sadece tek bir karakterin yerini tutmaktır (yeni satır karakteri hariç). Ama biraz sonra öğreneceğimiz metakarakter yardımıyla “ah” ve “meh” hecelerinin yerini de tutabileceğiz.</p>
<p><code>.</code> sembolünü kullanarak bir örnek daha yapalım.</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'23BH56'</span><span class="p">,</span> <span class="s1">'TY76Z'</span><span class="p">,</span> <span class="s1">'4Y7UZ'</span><span class="p">,</span> <span class="s1">'TYUDZ'</span><span class="p">,</span> <span class="s1">'34534'</span><span class="p">,</span> <span class="s2">"1agAY54"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">".[0-9a-z]"</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mf">23</span><span class="n">BH56</span>
<span class="mf">34534</span>
<span class="mf">1</span><span class="n">agAY54</span>
</code></pre></div>
<p>Burada yaptığımız şey çok basit. Şu özelliklere sahip bir karakter dizisi arıyoruz:</p>
<ol>
<li>Herhangi bir karakter ile başlayacak. Bu karakter sayı, harf veya başka bir karakter olabilir.</li>
<li>Ardından bir sayı veya alfabedeki küçük harflerden herhangi birisi gelecek.</li>
<li>Bu ölçütleri karşıladıktan sonra, aradığımız karakter dizisi herhangi bir karakter ile devam edebilir.</li>
</ol>
<p>Yukarıdaki ölçütlere uyan karakter dizilerimiz: “23BH56”, “34534”, “1agAY54”</p>
<h2>* Yıldız</h2>
<p>Bu metakarakter, <strong>kendinden önce gelen karakteri SIFIR veya daha fazla</strong> sayıda eşleştirir. Tanımı biraz karışık olsa da örnek yardımıyla bunu da anlayacağız:</p>
<div class="highlight"><pre><span></span><code><span class="n">yeniliste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"st"</span><span class="p">,</span> <span class="s2">"sat"</span><span class="p">,</span> <span class="s2">"saat"</span><span class="p">,</span> <span class="s2">"saaat"</span><span class="p">,</span> <span class="s2">"falanca"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">yeniliste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"sa*t"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>st
sat
saat
saaat
</code></pre></div>
<p>Burada <code>*</code> sembolü kendinden önce gelen <code>a</code> karakterini sıfır veya daha fazla sayıda eşleştiriyor. Yani mesela <code>st</code> içinde sıfır adet <code>a</code> karakteri var. Dolayısıyla bu karakter yazdığımız düzenli ifadeyle eşleşiyor. <code>sat</code> içinde bir adet <code>a</code> karakteri var. Dolayısıyla bu da eşleşiyor. <code>saat</code> ve <code>saaat</code> karakter dizilerinde sırasıyla iki ve üç adet <code>a</code> karakteri var. Tabii ki bunlar da yazdığımız düzenli ifadeyle eşleşiyor. Listemizin en son öğesi olan <code>falanca</code>da da ilk hecede bir adet <code>a</code> karakteri var. Ama bu öğedeki sorun, bunun <code>s</code> harfiyle başlamaması. Çünkü biz yazdığımız düzenli ifadede, aradığımız şeyin <code>s</code> harfi ile başlamasını, sıfır veya daha fazla sayıda <code>a</code> karakteri ile devam etmesini ve ardından da <code>t</code> harfinin gelmesini istemiştik. <code>falanca</code> öğesi bu koşulları karşılamadığı için süzgecimizin dışında kaldı.</p>
<p><code>s</code> harfinin de sıfır veya daha fazla sayıda eşleşmesini istersek düzenli ifademizi <code>s*a*t</code> veya <code>[sa]*t</code> biçiminde yazmamız gerekir. Bu iki seçenek içinde <code>[sa]*t</code> şeklindeki yazımı tercih etmenizi tavsiye ederim. </p>
<p>Bir başka örnek inceleyelim:</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"ahmet"</span><span class="p">,</span> <span class="s2">"kemal"</span><span class="p">,</span> <span class="s2">"kamil"</span><span class="p">,</span> <span class="s2">"mehmet"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">".*met"</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>ahmet
mehmet
</code></pre></div>
<p>Gördüğünüz gibi <code>ahmet</code> ve <code>mehmet</code> öğelerini başarıyla ayıkladık. Bunu yapmamızı sağlayan şey de <code>*</code> adlı metakarakter oldu. Burada Python’a şu emri verdik: <em>Bana kelime başında herhangi bir karakteri (<code>.</code> sembolü herhangi bir karakterin yerini tutuyor) sıfır veya daha fazla sayıda içeren ve sonu da <code>met</code> ile biten bütün öğeleri ver!</em></p>
<p>Kısaca ifade etmek gerekirse, bu komut sayesinde, sonu <code>met</code> ile biten her şey (<code>met</code> ifadesinin kendisi de dâhil olmak üzere) kapsama alanımıza girecektir.</p>
<h2>+ Artı</h2>
<p><code>+</code> metakarakteri <strong>kendisinden önce gelen karakteri BİR veya DAHA FAZLA sayıda</strong> tekrar eden karakterleri ayıklar.</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"ahmet"</span><span class="p">,</span> <span class="s2">"mehmet"</span><span class="p">,</span> <span class="s2">"met"</span><span class="p">,</span> <span class="s2">"kezban"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">".+met"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>ahmet
mehmet
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">yeniliste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"st"</span><span class="p">,</span> <span class="s2">"sat"</span><span class="p">,</span> <span class="s2">"saat"</span><span class="p">,</span> <span class="s2">"saaat"</span><span class="p">,</span> <span class="s2">"falanca"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">yeniliste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"sa+t"</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>sat
saat
saaat
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"23BH56"</span><span class="p">,</span> <span class="s2">"TY76Z"</span><span class="p">,</span> <span class="s2">"4Y7UZ"</span><span class="p">,</span> <span class="s2">"TYUDZ"</span><span class="p">,</span> <span class="s2">"34534"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"[A-Z]+[0-9]"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>TY76Z
</code></pre></div>
<h2>? Soru İşareti</h2>
<p><code>?</code> metakarakteri, <strong>kendisinden önce gelen karakterin SIFIR veya BİR defa</strong> eşleştiği durumları kapsar. Örneğe bakalım:</p>
<div class="highlight"><pre><span></span><code><span class="n">yeniliste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"st"</span><span class="p">,</span> <span class="s2">"sat"</span><span class="p">,</span> <span class="s2">"saat"</span><span class="p">,</span> <span class="s2">"saaat"</span><span class="p">,</span> <span class="s2">"falanca"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">yeniliste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"sa?t"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>st
sat
</code></pre></div>
<p>Şimdi bu metakarakteri kullanarak gerçek hayatta karşımıza çıkabilecek bir örnek verelim. Bu metakarakterin tanımına tekrar bakarsak, <strong>olsa da olur olmasa da olur</strong> diyebileceğimiz durumlar için bu metakarakterin rahatlıkla kullanılabileceğini görürüz. </p>
<p>Şöyle bir örnek verelim: Diyelim ki bir metin üzerinde arama yapacaksınız. Aradığınız kelime <code>uluslararası</code>:</p>
<div class="highlight"><pre><span></span><code><span class="n">metin</span> <span class="o">=</span> <span class="s2">"""Uluslararası hukuk, uluslar arası ilişkiler altında bir disiplindir. Uluslararası ilişkilerin hukuksal </span>
<span class="s2">boyutunu bilimsel bir disiplin içinde inceler. Devletlerarası hukuk da denir. Ancak uluslar arası ilişkilere yeni</span>
<span class="s2">aktörlerin girişi bu dalı sadece devletlerarası olmaktan çıkarmıştır."""</span>
</code></pre></div>
<p>Şimdi yapmak istediğimiz şey <code>uluslararası</code> kelimesini bulmak. Ama dikkat ederseniz metin içinde <code>uluslararası</code> kelimesi aynı zamanda <code>uluslar arası</code> şeklinde de geçiyor. Bizim bu iki kullanımı da kapsayacak bir düzenli ifade yazmamız gerekecek.</p>
<div class="highlight"><pre><span></span><code><span class="n">nesne</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s2">"[Uu]luslar ?arası"</span><span class="p">,</span> <span class="n">metin</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">nesne</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>Uluslararası
uluslar arası
Uluslararası
uluslar arası
</code></pre></div>
<p>Verdiğimiz düzenli ifade kalıbını dikkatlice inceleyin. Bildiğiniz gibi, <code>?</code> metakarakteri, kendinden önce gelen karakterin <strong>sıfır veya bir kez</strong> geçtiği durumları arıyor. Burada <code>?</code> sembolünü <code></code> karakterinden, yani <code>boşluk</code> karakterinden sonra kullandık. Dolayısıyla, <em>boşluk karakterinin sıfır veya bir kez geçtiği durumları</em> hedefledik. Bu şekilde hem <code>uluslar arası</code> hem de <code>uluslararası</code> kelimesini ayıklamış olduk. Düzenli ifademizde ayrıca <code>[Uu]</code> yazdık, çünkü metnimiz içinde <code>uluslararası</code> kelimesinin büyük harfle başladığı yerler de var. Bildiğiniz gibi, <code>uluslar</code> ve <code>Uluslar</code> kelimeleri asla aynı değildir. Dolayısıyla hem <code>u</code> harfini hem de <code>U</code> harfini bulmak için, daha önce öğrendiğimiz <code>[]</code> metakarakterini kullanıyoruz.</p>
<h2>{} Küme Parantezi</h2>
<p>{ } Küme Parantezi metakarakterimiz yardımıyla <strong>bir eşleşmeden kaç adet istediğimizi</strong> belirtebiliyoruz. Yine aynı örnek üzerinden gidelim:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">yeniliste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"sa</span><span class="si">{3}</span><span class="s2">t"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>saaat
</code></pre></div>
<p>Burada <code>a</code> karakterinin <strong>3 kez</strong> tekrar etmesini istediğimizi belirttik. Python da bu emrimizi hemen yerine getirdi.</p>
<p>Bu metakarakterin ilginç bir özelliği daha vardır. Küme içinde iki farklı sayı yazarak, <strong>bir karakterin en az ve en çok</strong> kaç kez tekrar etmesini istediğimizi belirtebiliriz. Örneğin:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">yeniliste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"sa{0,3}t"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>st
sat
saat
saaat
</code></pre></div>
<p><code>sa{0,3}t</code> ifadesiyle, <code>a</code> harfinin en az sıfır kez, en çok da üç kez tekrar etmesini istediğimiz söyledik. Dolayısıyla, “a” harfinin sıfır, bir, iki ve üç kez tekrar ettiği durumlar ayıklanmış oldu. </p>
<h2>^ Şapka</h2>
<p><code>^</code> sembolünün iki işlevi var. Birinci işlevi, <strong>Çok satırlı desende ya da bir karakter dizisinin en başındaki veriyi sorgulamaktır</strong>. <code>^</code> Şapka metakarakteri, düzenli ifadenin <strong>metnin herhangi bir satırının başında uyması durumunu kontrol eder.</strong> Bu metakarakter çok satırlı bir metin içinde kullanılıyorsa, her satırın başındaki kelime ile eşleşme olup olmadığını sorgular. Bunun için <code>re.M</code> ya da <code>re.MULTILINE</code> ifadesini koda eklemek gerekir. Yani aslında <code>match()</code> metodunun varsayılan olarak yerine getirdiği işlevi bu metakarakter yardımıyla <code>search()</code> metodunda da kullanabiliyoruz. <strong>Sadece kendinden sonra gelen BİR karaktere BAKMIYOR</strong>.</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'23BH56'</span><span class="p">,</span> <span class="s1">'TY76Z'</span><span class="p">,</span> <span class="s1">'4Y7UZ'</span><span class="p">,</span> <span class="s1">'TYUDZ'</span><span class="p">,</span> <span class="s1">'34534'</span><span class="p">,</span> <span class="s1">'1agAY54'</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"^[A-Z]+[0-9]"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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>TY7
</code></pre></div>
<p>Gördüğünüz gibi, <code>^</code> (şapka) metakarakteri <code>search()</code> metodunun, karakter dizilerinin sadece en başına bakmasını sağladı. O yüzden de bize sadece, <code>TY7</code> çıktısını verdi. </p>
<p>Aynı kodu, şapkasız olarak, şu şekilde kullanırsak:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"[A-Z]+[0-9]"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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>BH5
TY7
Y7
AY5
</code></pre></div>
<p>Gördüğünüz gibi, <code>^</code> şapka sembolü olmadığında <code>search()</code> metodu karakter dizisinin tamamını tarıyor. Biz yukarıdaki koda bir <code>^</code> sembolü ekleyerek, metodumuzun sadece karakter dizisinin en başına bakmasını istedik. </p>
<p>Burada dikkatimizi çekmesi gereken başka bir nokta da, <code>search()</code> metodundaki çıktının <strong>kırpılmış</strong> olması. Dikkat ettiyseniz, <code>search()</code> metodu bize öğenin tamamını vermedi. Öğelerin yalnızca <code>[A-Z]+[0-9]</code> kalıbına uyan kısımlarını verdi. Çünkü biz ona tersini söylemedik. Eğer öğelerin tamamını istiyorsak bunu açık açık belirtmemiz gerekir:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"[A-Z]+[0-9].*"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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>BH56
TY76Z
Y7UZ
AY54
</code></pre></div>
<p>Veya metodumuzun karakter dizisinin sadece en başına bakmasını istersek:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"^[A-Z]+[0-9].*"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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>TY76Z
</code></pre></div>
<p>Bu kodlarda düzenli ifade kalıbının sonuna <code>.*</code> sembolünü eklediğimize dikkat edin. Böylelikle metodumuzun sonu herhangi bir şekilde biten öğeleri bize vermesini sağladık.</p>
<p><code>^</code> metakarakterinin, karakter dizilerinin en başına demir atmak dışında başka bir görevi daha vardır: <strong>Hariç</strong> anlamına gelmektedir.</p>
<p>Bu görevini sadece <code>[]</code> metakarakterinin içinde kullanıldığı zaman yerine getirir. Bunu bir örnekle görelim. Yukarıdaki listemiz üzerinde öyle bir süzgeç uygulayalım ki, <strong>1agAY54</strong> öğesi çıktılarımız arasında görünmesin. </p>
<p>Bu öğeyi avlayabilmek için kullanmamız gereken düzenli ifade şöyle olacaktır: <code>[0-9A-Z][^a-z]+</code></p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
<span class="n">nesne</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"[0-9A-Z][^a-z]+"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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><span class="mf">23</span><span class="n">BH56</span>
<span class="n">TY76Z</span>
<span class="mf">4</span><span class="n">Y7UZ</span>
<span class="n">TYUDZ</span>
<span class="mf">34534</span>
</code></pre></div>
<p>Burada şu ölçütlere sahip bir öğe arıyoruz:</p>
<ol>
<li>Aradığımız öğe bir sayı veya büyük harf ile başlamalı</li>
<li>En baştaki sayı veya büyük harften sonra küçük harf <strong>GELMEMELİ</strong> (Bu ölçütü “^” işareti sağlıyor)</li>
<li>Üstelik bu <strong>“küçük harf gelmeme durumu”</strong> bir veya daha fazla sayıda tekrar etmeli. Yani baştaki sayı veya büyük harften sonra kaç tane olursa olsun asla küçük harf gelmemeli (Bu ölçütü de “+” işareti sağlıyor”)</li>
</ol>
<p>Bu ölçütlere uymayan tek öğe “1agAY54” olacaktır. Dolayısıyla bu öğe çıktıda görünmez.</p>
<p>Burada, <code>^</code> işaretinin nasıl kullanıldığına ve küçük harfleri nasıl dışarıda bıraktığına dikkat edin. Unutmayalım, bu <code>^</code> işaretinin <strong>hariç</strong> anlamı sadece <code>[]</code> metakarakterinin içinde kullanıldığı zaman geçerlidir.</p>
<p><code>^</code> metakarakterinin <code>findall</code> fonksiyonu ile çok satırlı / paragraflı metin içinde kullanımına bir örnek verelim.</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">"""Python (C, C++, Perl, Ruby ve benzerleri gibi) bir programlama dilidir ve tıpkı öteki programlama dilleri gibi, önünüzde duran kara kutuya, yani bilgisayara hükmetmenizi sağlar.</span>
<span class="s2">Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan, isminin Python olmasına aldanarak, bu programlama dilinin, adını piton yılanından aldığını düşünür.</span>
<span class="s2">Peki neden piyasada iki farklı Python sürümü var ve bu bizim için ne anlama geliyor?</span>
<span class="s2">Python programlama dili 1990 yılından bu yana geliştirilen bir dil. Bu süre içinde pek çok Python programı yazıldı ve insanların kullanımına sunuldu. Şu anda piyasada Python’ın 2.x serisinden bir sürümle yazılmış pek çok program bulunuyor. 3.x serisi ise ancak son yıllarda yaygınlık kazanmaya başladı."""</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"^P\w+"</span>
<span class="n">eslesme</span> <span class="o">=</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> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="k">for</span> <span class="n">eslesen</span> <span class="ow">in</span> <span class="n">eslesme</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">eslesen</span><span class="p">)</span>
</code></pre></div>
<p>Yukarıdaki kodu incelersek; desen ile <strong>P</strong> harfi ile başlayan ve devamında harf gruplarının geldiği tüm kelimelerin tespit edilmeye çalışıldığını görüyoruz. <code>findall</code> fonksiyonu içerisinde <code>re.MULTILINE</code> ifadesi kullanıldığı için tüm paragraflarda eşleşme aranır. <code>^</code> metakarakteri ile <strong>tüm paragrafların başlarında</strong> eşleşme olup olmadığı sorgulanır. Kodun çıktısı aşağıdaki gibidir.</p>
<div class="highlight"><pre><span></span><code><span class="n">Python</span>
<span class="n">Peki</span>
<span class="n">Python</span>
</code></pre></div>
<h2>$ Dolar</h2>
<p><code>$</code> metakarakteri, <strong>Çok satırlı desenin ya da dizelerin nasıl biteceğini</strong> belirliyor. Bu sembol arama/eşleştirme işleminin karakter dizisinin en sonuna bakmasını sağlıyor. Bu metakarakter çok satırlı bir metin içinde kullanılıyorsa, her satırın sonundaki kelime ile eşleşme olup olmadığı sorgulanır. Bunun için <code>re.M</code> ya da <code>re.MULTILINE</code> ifadesini koda eklemek gerekir. <strong>Sadece kendinden önceki BİR karaktere BAKMIYOR</strong>. Hatırlarsınız <code>^</code> metakarakteri eşleştirme işleminin karakter dizisinin en başından başlamasını sağlıyordu.</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"at"</span><span class="p">,</span> <span class="s2">"katkı"</span><span class="p">,</span> <span class="s2">"fakat"</span><span class="p">,</span> <span class="s2">"atkı"</span><span class="p">,</span> <span class="s2">"rahat"</span><span class="p">,</span> <span class="s2">"mat"</span><span class="p">,</span> <span class="s2">"yat"</span><span class="p">,</span> <span class="s2">"sat"</span><span class="p">,</span> <span class="s2">"satılık"</span><span class="p">,</span> <span class="s2">"katılım"</span><span class="p">]</span>
</code></pre></div>
<p>Diyelim ki yukarıda tanımlı listeden, <strong>at</strong> hecesiyle biten kelimeleri ayıklamak istiyoruz:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"at$"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>at
fakat
rahat
mat
yat
sat
</code></pre></div>
<p>Burada <code>$</code> metakarakteri sayesinde aradığımız karakter dizisinin nasıl bitmesi gerektiğini belirleyebildik. Eğer biz <strong>at</strong> ile başlayan bütün öğeleri ayıklamak isteseydik ne yapmamız gerektiğini biliyorsunuz:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"^at"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>at
atkı
</code></pre></div>
<p>Gördüğünüz gibi, <code>^</code> işareti bir karakter dizisinin nasıl başlayacağını belirlerken, <code>$</code> işareti aynı karakter dizisinin nasıl biteceğini belirliyor. </p>
<p>Başka bir örnekle devam edelim. Bu defa <strong>liste</strong> veri tipi yerine <strong>dizgi/dize (string)</strong> veri tipi kullanalım. Elimizde aşağıdaki şekilde bir metin olduğunu düşünerek <code>$</code> metakarakterini inceleyelim.</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">"""Python (C, C++, Perl, Ruby ve benzerleri gibi) bir programlama dilidir ve tıpkı öteki programlama dilleri gibi, önünüzde duran kara kutuya, yani bilgisayara hükmetmenizi sağlar.</span>
<span class="s2">Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan, isminin Python olmasına aldanarak, bu programlama dilinin, adını piton yılanından aldığını düşünür. </span>
<span class="s2">Dediğimiz gibi, Python bir programlama dilidir. Üstelik pek çok dile kıyasla öğrenmesi kolay bir programlama dilidir. Bu yüzden, eğer daha önce hiç programlama deneyiminiz olmamışsa, programlama maceranıza Python’la başlamayı tercih edebilirsiniz.</span>
<span class="s2">Eğer daha önce Python programlama dili ile ilgili araştırma yaptıysanız, şu anda piyasada iki farklı Python serisinin olduğu dikkatinizi çekmiş olmalı. 15.12.2023 tarihi itibariyle piyasada olan en yeni Python sürümleri Python 2.7.18 ve Python 3.12.1’dir.</span>
<span class="s2">Eğer bir Python sürümü 2 sayısı ile başlıyorsa (mesela 2.7.15), o sürüm Python 2.x serisine aittir. Yok eğer bir Python sürümü 3 sayısı ile başlıyorsa (mesela 3.7.0), o sürüm Python 3.x serisine aittir."""</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\w+r\.$"</span>
<span class="n">eslesme</span> <span class="o">=</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> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="k">for</span> <span class="n">eslesen</span> <span class="ow">in</span> <span class="n">eslesme</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">eslesen</span><span class="p">)</span>
</code></pre></div>
<p>Yukarıdaki kodu incelersek; desen ile öncesinde harf gruplarının geldiği sonrasında ise <strong>r.</strong> ile biten tüm kelimelerin tespit edilmeye çalışıldığını görüyoruz. <code>findall</code> fonksiyonu içerisinde <code>re.MULTILINE</code> ifadesi kullanıldığı için tüm paragraflarda eşleşme aranır. <code>$</code> metakarakteri ile <strong>tüm paragrafların sonlarında</strong> eşleşme olup olmadığı sorgulanır. Kodun çıktısı aşağıdaki gibidir.</p>
<div class="highlight"><pre><span></span><code><span class="n">sağlar</span><span class="o">.</span>
<span class="nb">dir</span><span class="o">.</span>
<span class="n">aittir</span><span class="o">.</span>
</code></pre></div>
<p>Dikkat edilmesi gereken bir husus ta şudur ki;</p>
<ul>
<li><code>^</code> işareti bir karakter dizisinin başına yazılırken</li>
<li><code>$</code> işareti karakter dizisinin sonuna yazılırken</li>
</ul>
<h2>\ Ters Bölü</h2>
<p>Bu işaret bildiğimiz <strong>kaçış dizisi</strong>dir. Peki burada ne işi var? Şimdiye kadar öğrendiğimiz konulardan gördüğünüz gibi, Python’daki düzenli ifadeler açısından özel anlam taşıyan bir takım semboller/metakarakterler var. Bunlar kendileriyle eşleşmiyorlar. Yani bir karakter dizisi içinde bu sembolleri arıyorsak eğer, bunların taşıdıkları özel anlam yüzünden bu sembolleri ayıklamak hemencecik mümkün olmayacaktır. Yani mesela biz <code>$</code> sembolünü arıyor olsak, bunu Python’a nasıl anlatacağız? Çünkü bu sembolü yazdığımız zaman Python bunu farklı algılıyor. Lafı dolandırmadan hemen bir örnek verelim…</p>
<p>Diyelim ki elimizde şöyle bir liste var:</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"10$"</span><span class="p">,</span> <span class="s2">"25€"</span><span class="p">,</span> <span class="s2">"20$"</span><span class="p">,</span> <span class="s2">"10TL"</span><span class="p">,</span> <span class="s2">"25£"</span><span class="p">]</span>
</code></pre></div>
<p>Amacımız bu listedeki <strong>dolarlı</strong> değerleri ayıklamaksa ne yapacağız? Şunu deneyelim önce:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"[0-9]+$"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<p>Python <code>$</code> işaretinin özel anlamından dolayı, bizim sayıyla biten bir karakter dizisi aradığımızı zannedecek, dolayısıyla da herhangi bir çıktı vermeyecektir. Çünkü listemizde sayıyla biten bir karakter dizisi yok.</p>
<p>Peki biz ne yapacağız? İşte bu noktada <code>\</code> metakarakteri devreye girecek. Hemen bakalım:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"[0-9]+\$"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mi">10</span><span class="err">$</span>
<span class="mi">20</span><span class="err">$</span>
</code></pre></div>
<p>Gördüğünüz gibi, “\” sembolünü kullanarak “$” işaretinin özel anlamından kaçtık.</p>
<h2>| Dik Çizgi, Boru (Pipe) Sembolü</h2>
<p>Bu metakarakter, birden fazla düzenli ifade kalıbını birlikte eşleştirmemizi sağlar. <code>|</code> sembolü, <strong>VEYA</strong> anlamına gelir diyebiliriz. Yani birkaç alternatif modelden <strong>herhangi birini</strong> eşleştirir. Eşleştirme için birden fazla kriter belirlermek için <code>|</code> sembölünü kullanabiliriz. Hemen örnek yapalım:</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"at"</span><span class="p">,</span> <span class="s2">"katkı"</span><span class="p">,</span> <span class="s2">"fakat"</span><span class="p">,</span> <span class="s2">"atkı"</span><span class="p">,</span> <span class="s2">"rahat"</span><span class="p">,</span> <span class="s2">"mat"</span><span class="p">,</span> <span class="s2">"yat"</span><span class="p">,</span> <span class="s2">"sat"</span><span class="p">,</span> <span class="s2">"satılık"</span><span class="p">,</span> <span class="s2">"katılım"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"^at|at$"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>at
fakat
atkı
rahat
mat
yat
sat
</code></pre></div>
<p>Gördüğünüz gibi <code>|</code> metakarakterini kullanarak <strong>at</strong> ile başlayan <strong>ve</strong> biten kelimeleri bulduk / ayıkladık. <code>|</code> sembolünü kullanmasaydık ve aşağıdaki ifadesiyi yazsaydık <strong>atat</strong> ile başlayan ve biten kelime aramış olurduk ve sonuç bulamazdık.</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"^atat$"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<p>Aşağıdaki ifadesiyi yazmış olsaydık ise <strong>at</strong> ile başlayan ve biten kelime aramış olurduk ve sadece <strong>at</strong> sonucunu elde ederdik.</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"^at$"</span><span class="p">,</span><span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>at
</code></pre></div>
<h2>( ) Parantez</h2>
<p>Bu metakarakter yardımıyla <strong>düzenli ifade kalıplarını gruplayacağız</strong>. Ayrıca gruplandırılmış ifadelerine denk gelen kalıpları saklar ve en fazla 9 kalıp saklayabilir. Bu metakarakter bizim bir karakter dizisinin istediğimiz kısımlarını ayıklamamızda çok büyük kolaylıklar sağlayacak.</p>
<div class="highlight"><pre><span></span><code><span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"ali"</span><span class="p">,</span> <span class="s2">"veli"</span><span class="p">,</span> <span class="s2">"deli"</span><span class="p">,</span> <span class="s2">"zeki"</span><span class="p">,</span> <span class="s2">"abi"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">x</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"a(b|l)i"</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>ali
abi
</code></pre></div>
<p>Parantez ile gruplanan desenler, <strong>bir bütünsel yapı olarak</strong> değerlendirilir. Yani <code>ha+</code> kodu yazıldığında <code>h</code> harfinden sonra <code>a</code> harfinden Bir veya daha fazla olması anlaşılırken, <code>(ha)+</code> kodu ile <code>ha</code> ifadesinden bir veya daha fazla olması istenildiği ifade edilmiş olunur. Bir örnek yapalım;</p>
<div class="highlight"><pre><span></span><code><span class="n">veri</span> <span class="o">=</span> <span class="s2">"ali veli hakiki deli zeki abi samimi"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="s2">"\w+(\w</span><span class="si">{2}</span><span class="s2">)</span><span class="si">{2}</span><span class="s2">"</span>
<span class="n">sonuc</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">veri</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">sonuc</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>hakiki
samimi
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">veri</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'650-654-7544'</span><span class="p">,</span> <span class="s1">'Mustafa Halil'</span><span class="p">,</span> <span class="s1">'650524495'</span><span class="p">,</span> <span class="s1">'65080976'</span><span class="p">,</span> <span class="s1">'08069114'</span><span class="p">,</span> <span class="s1">'656037422'</span><span class="p">,</span> <span class="s1">'6504476824'</span><span class="p">,</span> <span class="s1">'6508000010'</span><span class="p">,</span>
<span class="s1">'6501552207'</span><span class="p">,</span> <span class="s1">'(650)605 09 96'</span><span class="p">,</span> <span class="s1">'650-537-82-34'</span><span class="p">,</span> <span class="s1">'6503320122'</span><span class="p">,</span> <span class="s1">'650_919_64'</span><span class="p">,</span> <span class="s1">'650-abc-7425'</span><span class="p">,</span> <span class="s1">'6509318724'</span><span class="p">,</span> <span class="s1">'6502184706'</span><span class="p">,</span>
<span class="s1">'650-xyz-1653'</span><span class="p">,</span> <span class="s1">'6501921596'</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">veri</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">"(\d</span><span class="si">{3}</span><span class="s2">)-([a-z]</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">i</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mf">650</span><span class="o">-</span><span class="n">abc</span><span class="o">-</span><span class="mf">7425</span>
<span class="mf">650</span><span class="o">-</span><span class="n">xyz</span><span class="o">-</span><span class="mf">1653</span>
</code></pre></div>
<p><code>r"(\d{3})-([a-z]{3})-(\d{4})"</code> deseni ile 3 adet grup oluşturduk. Bu desenleri açıklayalım;</p>
<ul>
<li><code>(\d{3})</code> = <strong>3 adet rakam</strong>, ardından </li>
<li><code>-</code> = <strong>Tire işareti</strong> , ardından</li>
<li><code>([a-z]{3})</code> = <strong>a'dan z'ye kadar 3 adet küçük harf</strong> , ardından</li>
<li><code>-</code> = <strong>Tire işareti</strong> ve son olarak</li>
<li><code>(\d{4})</code> = <strong>4 adet rakam</strong></li>
</ul>
<p>dan oluşan bir değer arıyorum.</p>
<p>Şimdi grupları açıklamaya çalışayım.</p>
<div class="highlight"><pre><span></span><code><span class="n">veri</span> <span class="o">=</span> <span class="s2">"08069114 6501552207 650-abc-7425 (650)605 09 96 650-537-82-34 650_919_64 6509318724 650-xyz-1653"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"(\d</span><span class="si">{3}</span><span class="s2">)-([a-z]</span><span class="si">{3}</span><span class="s2">)-(\d</span><span class="si">{4}</span><span class="s2">)"</span>
<span class="n">eslesen</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">veri</span><span class="p">)</span>
<span class="k">for</span> <span class="n">es</span> <span class="ow">in</span> <span class="n">eslesen</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">es</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mf">650</span><span class="o">-</span><span class="n">abc</span><span class="o">-</span><span class="mf">7425</span>
<span class="mf">650</span><span class="o">-</span><span class="n">xyz</span><span class="o">-</span><span class="mf">1653</span>
</code></pre></div>
<p>Görüldüğü üzere aranan desene uygun 2 adet sonuç elde ettik; <strong>650-abc-7425</strong> ve <strong>650-xyz-1653</strong>. </p>
<p>Parantez içine aldığımız desenlerin her biri <strong>bir grubu ifade ediyor</strong>. Bu değerleri ekrana yazdırmak için <code>group()</code> metodunu kullandık. <code>group()</code> metodu ile <code>group(0)</code> metodu aynıdır. Desenimizde (parantez içinde) 3 grup olduğu için <code>group(1), group(2)</code> ve <code>group(3)</code> yöntemiyle, eşleşen 3 gruba ayrı ayrı erişebiliriz. Aşağıdaki kodları inceleyin;</p>
<div class="highlight"><pre><span></span><code><span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"(\d</span><span class="si">{3}</span><span class="s2">)-([a-z]</span><span class="si">{3}</span><span class="s2">)-(\d</span><span class="si">{4}</span><span class="s2">)"</span>
<span class="n">eslesen</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"1. Grup Değerleri:"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">es</span> <span class="ow">in</span> <span class="n">eslesen</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">es</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mf">1.</span><span class="w"> </span><span class="n">Grup</span><span class="w"> </span><span class="n">Değerleri</span><span class="p">:</span>
<span class="mf">650</span>
<span class="mf">650</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"(\d</span><span class="si">{3}</span><span class="s2">)-([a-z]</span><span class="si">{3}</span><span class="s2">)-(\d</span><span class="si">{4}</span><span class="s2">)"</span>
<span class="n">eslesen</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"2. Grup Değerleri:"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">es</span> <span class="ow">in</span> <span class="n">eslesen</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">es</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>
<div class="highlight"><pre><span></span><code><span class="mf">2.</span><span class="w"> </span><span class="n">Grup</span><span class="w"> </span><span class="n">Değerleri</span><span class="p">:</span>
<span class="n">abc</span>
<span class="n">xyz</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"(\d</span><span class="si">{3}</span><span class="s2">)-([a-z]</span><span class="si">{3}</span><span class="s2">)-(\d</span><span class="si">{4}</span><span class="s2">)"</span>
<span class="n">eslesen</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"3. Grup Değerleri:"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">es</span> <span class="ow">in</span> <span class="n">eslesen</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">es</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="mf">3.</span><span class="w"> </span><span class="n">Grup</span><span class="w"> </span><span class="n">Değerleri</span><span class="p">:</span>
<span class="mf">7425</span>
<span class="mf">1653</span>
</code></pre></div>
<h1>Eşleşme Nesnelerinin Metotları</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. 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><code>group()</code> metoduna ait benzer bir örnek yukarıdaki <strong>( ) Parantez</strong> başlığı altında 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="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>
<h1>Özel Diziler</h1>
<h2>\s Boşluk Karakterinin Yerini Tutan Özel Dizi.</h2>
<p>Bu sembol (<code>\s</code>), bir karakter dizisi içinde geçen <strong>boşlukları (boşluk, tab ve enter karakterlerini) yakalamak</strong> için kullanılır.</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"5 Ocak"</span><span class="p">,</span> <span class="s2">"27Mart"</span><span class="p">,</span> <span class="s2">"4 Ekim"</span><span class="p">,</span> <span class="s2">"Nisan 3"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"[0-9]\s[A-Za-z]+"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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><span class="mf">5</span><span class="w"> </span><span class="n">Ocak</span>
<span class="mf">4</span><span class="w"> </span><span class="n">Ekim</span>
</code></pre></div>
<p>Yukarıdaki örnekte, bir sayı ile başlayan, ardından bir adet boşluk karakteri içeren, sonra da bir büyük veya küçük harfle devam eden karakter dizilerini ayıkladık. Burada boşluk karakterini <code>\s</code> simgesi ile gösterdiğimize dikkat edin.</p>
<h2>\S Boşluk Karakterinin Dışındaki Karakterlerin Tutan Özel Dizi.</h2>
<p><code>\S</code> özel dizisi, <strong>boşluk olmayan karakterleri</strong> avlar.</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"\d+\S\w+"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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><span class="mf">27</span><span class="n">Mart</span>
</code></pre></div>
<h2>\d Sayıların Yerini Tutan Özel Dizi.</h2>
<p>Bu sembol, bir karakter dizisi içinde geçen <strong>rakamları (ondalık sayıları) eşleştirmek için</strong> kullanılır. <code>[0-9]</code> ifadesi ile arasında önemli bir fark vardır. <strong>\d</strong> yazdığımızda, Arapça, Rusça, Çince,...vb dillerdeki rakamları da yakalar, eşleştirir. Çok dilli metinlerle çalışırken bu konuya dikkat etmek gerekir.</p>
<p>Buraya kadar olan örneklerde bu işlevi yerine getirmek için <code>[0-9]</code> ifadesinden yararlanıyorduk. Şimdi artık aynı işlevi daha kısa yoldan, <code>\d</code> dizisi ile yerine getirebiliriz. İsterseniz yine yukarıdaki örnekten gidelim:</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"5 Ocak"</span><span class="p">,</span> <span class="s2">"27Mart"</span><span class="p">,</span> <span class="s2">"4 Ekim"</span><span class="p">,</span> <span class="s2">"Nisan 3"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"\d\s[A-Za-z]+"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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><span class="mf">5</span><span class="w"> </span><span class="n">Ocak</span>
<span class="mf">4</span><span class="w"> </span><span class="n">Ekim</span>
</code></pre></div>
<p>Burada, <code>[0-9]</code> yerine <code>\d</code> yerleştirerek daha kısa yoldan sonuca vardık.</p>
<h2>\D Sayı Olmayan Karakterlerin Yerini Tutan Özel Dizi.</h2>
<p><code>\D</code> özel dizisi <strong>rakam (ondalık sayı) olmayan karakterleri</strong> avlar. Yani <code>[^0-9]</code> ile eşdeğerdir.</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"\D+"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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> Ocak
Mart
Ekim
Nisan
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</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">"\s\D+"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</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> Ocak
Ekim
</code></pre></div>
<h2>\w Alfanümerik Karakterlerin Yerini Tutan Özel Dizi.</h2>
<p>Bu sembol, bir karakter dizisi içinde geçen <strong>alfanümerik karakterleri (harf, rakam) ve buna ek olarak alt çizgi karakterini</strong> <code>_</code> bulmak için kullanılır. </p>
<p>Bu özel dizi şu ifadeyle aynı anlama gelir: <code>[a-zA-Z0-9_]</code>. Bu ifadeyi yazmaktansa <code>\w</code> yazmanın ne kadar kolay olduğu ortada.</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="s2">"abc123_$%+"</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"\w*"</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>abc123_
</code></pre></div>
<h2>\W Alfanümerik Karakterlerin Dışındaki Karakterlerin Yerini Tutan Özel Dizi.</h2>
<p>Bu sembol <strong>Harf, rakam ve alt çizgi karakteri dışında</strong> herhangi bir şeyle eşleşir. </p>
<p>Bu özel dizi şu ifadeyle aynı anlama gelir: <code>[^a-zA-Z0-9_]</code> ile eşdeğerdir</p>
<div class="highlight"><pre><span></span><code><span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"abc"</span><span class="p">,</span> <span class="s2">"123"</span><span class="p">,</span> <span class="s2">"$%+"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">b</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"\W*"</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">())</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>$%+
</code></pre></div>
<p>Şimdi bu özel diziler için genel bir örnek verip konuyu kapatalım.</p>
<div class="highlight"><pre><span></span><code><span class="n">veriler</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"esra : istinye 05331233445"</span><span class="p">,</span> <span class="s2">"esma : levent 05322134344"</span><span class="p">,</span> <span class="s2">"sevgi : dudullu 05354445434"</span><span class="p">,</span>
<span class="s2">"kemal : sanayi 05425455555"</span><span class="p">,</span> <span class="s2">"osman : tahtakale 02124334444"</span><span class="p">,</span><span class="s2">"metin : taksim 02124344332"</span><span class="p">]</span>
</code></pre></div>
<p>Amacımız bu listede yer alan isim ve telefon numaralarını <code>isim > telefon numarası</code> şeklinde almak:</p>
<div class="highlight"><pre><span></span><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">veriler</span><span class="p">:</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">"(\w+)\s+:\s(\w+)\s+(\d+)"</span><span class="p">,</span><span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nesne</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2"> > </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</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="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>
</code></pre></div>
<div class="highlight"><pre><span></span><code>esra > 05331233445
esma > 05322134344
sevgi > 05354445434
kemal > 05425455555
osman > 02124334444
metin > 02124344332
</code></pre></div>
<p>Burada formülümüz şu şekilde: <code>Bir veya daha fazla karakter</code> + <code>bir veya daha fazla boşluk</code> + <code>’:’ işareti</code> + <code>“bir adet boşluk</code> + <code>bir veya daha fazla sayı</code></p>
<h2>\A Metin Başında Eşleşme Kontrolü</h2>
<p><code>\A</code> meta karakteri, <strong>bir düzenli ifadenin (string ifade çok satırlı da olsa) yalnız başlangıcı ile eşleşme olup olmadığını tespit eder.</strong> Başka bir deyişle, <code>\A</code> ifadesi sadece tüm metnin başlangıcında eşleşmeye çalışır. <code>^</code> (şapka) metakarakteri ile tüm paragraf başlarında eşleşme olup olmadığı kontrol edilirken <code>\A</code> ile sadece metnin en baş kısmına bakılır. </p>
<p><code>\A</code> metakarakterinin <code>findall</code> fonksiyonu ile (çok satırlı / paragraflı metin içinde) kullanımına bir örnek verelim.</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">"""Python (C, C++, Perl, Ruby ve benzerleri gibi) bir programlama dilidir ve tıpkı öteki programlama dilleri gibi, önünüzde duran kara kutuya, yani bilgisayara hükmetmenizi sağlar.</span>
<span class="s2">Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan, isminin Python olmasına aldanarak, bu programlama dilinin, adını piton yılanından aldığını düşünür.</span>
<span class="s2">Peki neden piyasada iki farklı Python sürümü var ve bu bizim için ne anlama geliyor?</span>
<span class="s2">Python programlama dili 1990 yılından bu yana geliştirilen bir dil. Bu süre içinde pek çok Python programı yazıldı ve insanların kullanımına sunuldu. Şu anda piyasada Python’ın 2.x serisinden bir sürümle yazılmış pek çok program bulunuyor. 3.x serisi ise ancak son yıllarda yaygınlık kazanmaya başladı."""</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\AP\w+"</span>
<span class="n">eslesme</span> <span class="o">=</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> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="k">for</span> <span class="n">eslesen</span> <span class="ow">in</span> <span class="n">eslesme</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">eslesen</span><span class="p">)</span>
</code></pre></div>
<p>Yukarıdaki kodu incelersek; desen ile <strong>P</strong> harfi ile başlayan ve devamında harf gruplarının geldiği tüm kelimelerin tespit edilmeye çalışıldığını görüyoruz. <code>findall</code> fonksiyonu içerisinde <code>re.MULTILINE</code> ifadesi kullanılmasına rağmen <code>\A</code> metakarakteri tüm paragraflarda eşleşme aramaz, sadece metnin başını kontrol eder. Kodun çıktısı aşağıdadır.</p>
<div class="highlight"><pre><span></span><code><span class="n">Python</span>
</code></pre></div>
<h2>\Z Metin Sonunda Eşleşme Kontrolü</h2>
<p><code>\Z</code> metakarakteri, <strong>dizelerin (stringlerin) sonunda eşleşme olup olmadığını sorgulamak için kullanılır.</strong> Bu sembol arama/eşleştirme işleminin karakter dizisinin en sonuna bakmasını sağlıyor. Bu metakarakter çok satırlı bir metin içinde kullanılıyorsa, <strong>sadece metnin en sonuna, son satırın sonuna bakar, her satırın sonundaki kelime ile eşleşme olup olmadığına bakmaz.</strong> Çok satırlı metinde eşleştirme yapmak için <code>re.M</code> ya da <code>re.MULTILINE</code> ifadesini koda eklemek gerekir. <strong>Sadece kendinden önceki BİR karaktere BAKMIYOR</strong>. Hatırlarsınız <code>^</code> metakarakteri eşleştirme işleminin karakter dizisinin en başından başlamasını sağlıyordu.</p>
<p>Bir örnek verelim;</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">"""Python (C, C++, Perl, Ruby ve benzerleri gibi) bir programlama dilidir ve tıpkı öteki programlama dilleri gibi, önünüzde duran kara kutuya, yani bilgisayara hükmetmenizi sağlar.</span>
<span class="s2">Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan, isminin Python olmasına aldanarak, bu programlama dilinin, adını piton yılanından aldığını düşünür. </span>
<span class="s2">Dediğimiz gibi, Python bir programlama dilidir. Üstelik pek çok dile kıyasla öğrenmesi kolay bir programlama dilidir. Bu yüzden, eğer daha önce hiç programlama deneyiminiz olmamışsa, programlama maceranıza Python’la başlamayı tercih edebilirsiniz.</span>
<span class="s2">Eğer daha önce Python programlama dili ile ilgili araştırma yaptıysanız, şu anda piyasada iki farklı Python serisinin olduğu dikkatinizi çekmiş olmalı. 15.12.2023 tarihi itibariyle piyasada olan en yeni Python sürümleri Python 2.7.18 ve Python 3.12.1’dir.</span>
<span class="s2">Eğer bir Python sürümü 2 sayısı ile başlıyorsa (mesela 2.7.15), o sürüm Python 2.x serisine aittir. Yok eğer bir Python sürümü 3 sayısı ile başlıyorsa (mesela 3.7.0), o sürüm Python 3.x serisine aittir."""</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\w+r\.\Z"</span>
<span class="n">eslesme</span> <span class="o">=</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> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="k">for</span> <span class="n">eslesen</span> <span class="ow">in</span> <span class="n">eslesme</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">eslesen</span><span class="p">)</span>
</code></pre></div>
<p>Yukarıdaki kodu incelersek; desen ile öncesinde harf gruplarının geldiği sonrasında ise <strong>r.</strong> ile biten kelimelerin tespit edilmeye çalışıldığını görüyoruz. <code>findall</code> fonksiyonu içerisinde <code>re.MULTILINE</code> ifadesi kullanılmasına rağmen tüm paragraflarda eşleşme aranmaz. <code>\Z</code> metakarakteri ile <strong>sadece son paragrafın bitiminde</strong> eşleşme olup olmadığı sorgulanır. Kodun çıktısı aşağıdaki gibidir.</p>
<div class="highlight"><pre><span></span><code><span class="n">aittir</span><span class="o">.</span>
</code></pre></div>
<h2>\b Kelime Sınırını Belirten Özel Dizi</h2>
<p><code>\b</code> sembolü ile Kelimenin nasıl <strong>başlaması</strong>, nasıl <strong>bitmesi</strong> ya da tam olarak <strong>sınırlarının ne olması</strong> gerektiğini belirtebiliriz.</p>
<div class="highlight"><pre><span></span><code><span class="n">veri</span> <span class="o">=</span> <span class="s2">"Doğum günüm 01.02.1980. Ağabeyim Doğum günü ise 03.04.1975'te doğdu. Bilgisayarın ip adresi 04.05.18741'dir."</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\b[A-Z]\w+"</span>
<span class="n">b_harf</span> <span class="o">=</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">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">b_harf</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>['Doğum', 'Ağabeyim', 'Doğum', 'Bilgisayarın']
</code></pre></div>
<p>Büyük harf ile başlayan kelimeleri görmek istediğimizde yukarıdaki deseni kullanabiliriz.</p>
<p>Cümle sonlarını bulmak için ise aşağıdaki desen işimize yarayabilir.</p>
<div class="highlight"><pre><span></span><code><span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\w+\.\s\b"</span>
<span class="n">cumle_sonu</span> <span class="o">=</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">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">cumle_sonu</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>['1980. ', 'doğdu. ']
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">veri</span> <span class="o">=</span> <span class="s2">"Doğum günüm 01.02.1980. ağabeyim ise 03.04.1975'te doğdu. bilgisayarımın ip adresi 04.05.18741'dir."</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\d</span><span class="si">{2}</span><span class="s2">\.\d</span><span class="si">{2}</span><span class="s2">\.\d</span><span class="si">{4}</span><span class="s2">"</span>
<span class="n">d_gunleri</span> <span class="o">=</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">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">d_gunleri</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>['01.02.1980', '03.04.1975', '04.05.1874']
</code></pre></div>
<p>Görüldüğü gibi desene uygun sonuçlar aldık ancak çıktıdaki son değer, doğum günü olmamasına rağmen desenle eşleşti. Bu sorunu çözmek için, deseni başlangıç ve bitiş sınırlarını belirterek tanımlamalıyız. Yani desenin başına ve sonuna <code>\b</code> sembolünü eklemeliyiz.</p>
<div class="highlight"><pre><span></span><code><span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\b\d</span><span class="si">{2}</span><span class="s2">\.\d</span><span class="si">{2}</span><span class="s2">\.\d</span><span class="si">{4}</span><span class="s2">\b"</span>
<span class="n">d_gunleri</span> <span class="o">=</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">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">d_gunleri</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>['01.02.1980', '03.04.1975']
</code></pre></div>
<p>Desenin başına ve sonuna <code>\b</code> sembolünü ekleyerek, kelimenin tüm sınırlarını tanımlamış olduk. Bu desen ile; Kelime başında 2 adet rakam, ardından 1 nokta (.) sonrasında tekrar 2 adet rakam ve ardından nokta (.) gelsin son olarak ta 4 adet rakam olsun demiş olduk. Bu desen sayesinde <strong>04.05.18741</strong> değerini safdışı bırakış olduk.</p>
<p>Eğer verimizde tarih yazım biçimi farklı (örneğin nokta (.) ve taksim, bölü (/) işareti) olan birden fazla değerler olsaydı nasıl bir yol izlemeliydik? Buna da bir örnek verelim.</p>
<div class="highlight"><pre><span></span><code><span class="n">veri</span> <span class="o">=</span> <span class="s2">"Doğum günüm 01.02.1980. ağabeyim ise 03/04/1975'te doğdu. bilgisayarımın ip adresi 04.05.18741'dir."</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\b\d</span><span class="si">{2}</span><span class="s2">[./]\d</span><span class="si">{2}</span><span class="s2">[./]\d</span><span class="si">{4}</span><span class="s2">\b"</span>
<span class="n">d_gunleri</span> <span class="o">=</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">veri</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">d_gunleri</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>['01.02.1980', '03/04/1975']
</code></pre></div>
<p>Gördüğünüz gibi nokta (.) ve taksim, bölü (/) işaretini, köşeli parantez içerisine yazarak alternatif seçenekler oluşturmuş olduk.</p>
<p><strong>NOT:</strong> <strong>Nokta işaretini</strong> desen içinde doğrudan yazarken kaçış dizisi olan ters taksim işaretini yazmamız gerekiyor. Oysa köşeli parantez içerisinde yazdığımızda kaçış dizini olan ters bölü işaretini kullanmıyoruz. Bu, Köşeli parantezin bir özelliğidir. Diğer sembolleri de nokta gibi yazabiliyoruz.</p>
<h2>\B Özel Dizisi</h2>
<p><code>\b</code> özel dizisinin tam tersidir.</p>
<p>Örneğin <code>py\b</code> deseni, <strong>py</strong> ile biten dizilerle eşleşirken <code>py\B</code> deseni, <strong>py</strong> ifadesini içeren ancak <strong>py</strong> ile <strong>BİTMEYENLERLE</strong> eşleşir. </p>
<div class="highlight"><pre><span></span><code><span class="n">metin</span> <span class="o">=</span> <span class="s2">"Recep Ramazan Seher (Halil) Sertaç Halili zaman erkek Halil. şeker 2.345 python, py3, py2 py py. py!"</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\w+er\b"</span> <span class="c1"># başında alfanümerik karakterler olan sonu "er" ile biten kelimeleri bul.</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>['Seher', 'şeker']
</code></pre></div>
<p><code>"\w+er\b"</code> deseni ile, başında alfanümerik karakterler olan sonu <strong>er</strong> ile biten kelimeleri bulmaya çalıştık.</p>
<div class="highlight"><pre><span></span><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Recep'</span><span class="p">,</span> <span class="s1">'Ramazan'</span><span class="p">,</span> <span class="s1">'Seher'</span><span class="p">,</span> <span class="s1">'(Halil)'</span><span class="p">,</span> <span class="s1">'manzara'</span><span class="p">,</span> <span class="s1">'Sertaç'</span><span class="p">,</span> <span class="s1">'Halili'</span><span class="p">,</span> <span class="s1">'zaman'</span><span class="p">,</span> <span class="s1">'erkek'</span><span class="p">,</span> <span class="s1">'Halil.'</span><span class="p">,</span>
<span class="s1">'şeker'</span><span class="p">,</span> <span class="s1">'2.345'</span><span class="p">,</span> <span class="s1">'python,'</span><span class="p">,</span> <span class="s1">'py3,'</span><span class="p">,</span> <span class="s1">'py2'</span><span class="p">,</span><span class="s1">'py'</span><span class="p">,</span> <span class="s1">'py.'</span><span class="p">,</span> <span class="s1">'py!'</span><span class="p">]</span>
<span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"er\B"</span>
<span class="k">for</span> <span class="n">oge</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">oge</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">oge</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>Sertaç
erkek
</code></pre></div>
<p><code>"er\B"</code> deseni ile, içinde <strong>er</strong> ifadesi olan ancak sonu <strong>er</strong> ile <strong>bitmeyen</strong> kelimeleri bulmaya çalıştık.</p>
<div class="highlight"><pre><span></span><code><span class="n">desen</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">"\Ber\B"</span>
<span class="k">for</span> <span class="n">oge</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">desen</span><span class="p">,</span> <span class="n">oge</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">oge</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>Sertaç
</code></pre></div>
<p><code>"\Ber\B"</code> deseni ile, içinde <strong>er</strong> ifadesi olan ancak başında ve sonunda <strong>er</strong> ifadesi <strong>bulunmayan</strong> kelimeleri bulmaya çalıştık.</p>
<h1>Bayraklar (Flags)</h1>
<p>Buraya kadar öğrendiğimiz konularda, <strong>re</strong> modülünü kullanırken, eksiklik hissettiğiniz bazı durumlar ile karşılaşmış olabiliriz. Örneğin eşleşme yaparken <strong>küçük-büyük harf duyarlılığı</strong> ya da <strong>çok satırlı bir metin içindeki eşleşmeleri arama</strong> konuları bazen eksik sonuç elde etmenize sebep olmuş olabilir. Bu bölümde bahsedeceğim bayrak (flag) konusu, bu tür sorunların üstesinden gelmenize yardımcı olacaktır. İlk bayrak ile başlayalım.</p>
<h2>re.IGNORECASE veya re.I</h2>
<p>Bildiğiniz gibi, Python’da büyük-küçük harfler önemlidir. Yani eğer <strong>python</strong> kelimesini arıyorsanız, alacağınız çıktılar arasında <strong>Python</strong> olmayacaktır. Çünkü <strong>python</strong> ve <strong>Python</strong> birbirlerinden farklı iki karakter dizisidir. </p>
<h3>Neden Kullanılır?</h3>
<p><code>re.IGNORECASE</code> özelliği, metin maddeleme, metin analizi veya kullanıcı girdileri gibi durumlarda, kullanıcıların büyük harf küçük harf karışımıyla yazdığı verilere karşı daha esnek olmak için kullanılır. Özellikle, arama işlemlerini sırasında harf büyüklüğünün önemli olmadığı durumlarda faydalıdır.</p>
<p>Bir kullanıcı tarafından sağlanan veriyle çalışırken veya çok dilli metinlerle uğraşırken <code>re.IGNORECASE</code> özelliği, arama işlemlerini daha geniş bir kapsama yaymak ve daha fazla esneklik sağlamak için kullanışlı bir araçtır.</p>
<p><code>re.IGNORECASE</code> veya kısaca <code>re.I</code> adlı bayrak, bize <strong>büyük-küçük harfe dikkat etmeden (büyük harf ve küçük harf arasındaki farkı önemsemeden) arama / eşleme yapma</strong> imkanı sağlar. Hemen bir örnek verelim: </p>
<div class="highlight"><pre><span></span><code><span class="n">metin</span> <span class="o">=</span> <span class="s2">"""Programlama dili, programcının bir bilgisayara ne yapmasını</span>
<span class="s2">istediğini anlatmasının standartlaştırılmış bir yoludur. Programlama</span>
<span class="s2">dilleri, programcının bilgisayara hangi veri üzerinde işlem yapacağını,</span>
<span class="s2">verinin nasıl depolanıp iletileceğini, hangi koşullarda hangi işlemlerin</span>
<span class="s2">yapılacağını tam olarak anlatmasını sağlar. Şu ana kadar 2500’den fazla</span>
<span class="s2">programlama dili yapılmıştır. Bunlardan bazıları: Pascal, Basic, C, C#,</span>
<span class="s2">C++, Java, Cobol, Perl, Python, Ada, Fortran, Delphi programlama</span>
<span class="s2">dilleridir."""</span>
<span class="c1"># `re.compile()` ile kullanım</span>
<span class="n">derli</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="s2">"programlama"</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">derli</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>['Programlama', 'Programlama', 'programlama', 'programlama']
</code></pre></div>
<p>Gördüğünüz gibi, metinde geçen hem <strong>programlama</strong> kelimesini hem de <strong>Programlama</strong> kelimesini ayıklayabildik. Bunu yapmamızı sağlayan şey de <code>re.IGNORECASE</code> adlı bayrak (flag) oldu. </p>
<p>Eğer bu seçeneği kullanmasaydık, çıktıda yalnızca <strong>programlama</strong> kelimesini görürdük. Çünkü aradığımız şey aslında <strong>programlama</strong> kelimesi idi. Biz istersek <code>re.IGNORECASE</code> yerine kısaca <code>re.I</code> ifadesini de kullanabiliriz. Aynı anlama gelecektir.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Düzenli ifade içinde kullanım</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s1">'python'</span><span class="p">,</span> <span class="s1">'Python is powerful!'</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">result</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
</code></pre></div>
<p>Bayraklar, <code>Flags</code> etiketi ile de kullanılabilir;</p>
<div class="highlight"><pre><span></span><code><span class="n">derli</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="s2">"programlama"</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">derli</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">metin</span><span class="p">))</span>
</code></pre></div>
<h2>re.MULTILINE veya re.M</h2>
<p><code>re.MULTILINE</code> bayrağı (flag), bir düzenli ifadenin <strong>çok satırlı</strong> bir metin içindeki eşleşmeleri nasıl ele aldığını kontrol etmek için kullanılır. Bu bayrak, bir metin içindeki <strong>her bir satırı ayrı ayrı ele alarak</strong> düzenli ifadenin davranışını etkiler. Özellikle, <code>^</code> (başlangıç) ve <code>$</code> (bitiş) meta karakterlerinin metnin başı ve sonu yerine her satırın başı ve sonuyla eşleşmesini sağlar.</p>
<h3>Neden Kullanılır?</h3>
<p><code>re.MULTILINE</code> özelliği, çok satırlı metinlerle çalışırken ve her bir satırın başı veya sonu ile eşleşme yapmak istediğinizde kullanılır. Özellikle, metni satırlara bölüp her bir satıra ayrı ayrı düzenli ifadeler uygulamak istediğiniz durumlar için uygundur.</p>
<p>Bu özellik, metin maddeleme, metin analizi veya log dosyaları gibi çok satırlı metinlerle çalışırken kullanışlıdır. <code>re.MULTILINE</code> sayesinde, düzenli ifadelerle satırları tek tek ele alabilir ve her bir satır için eşleşmeleri bulabilirsiniz.</p>
<h3>Kullanımı</h3>
<p><code>re.MULTILINE</code> bayrağı, <code>re.compile()</code> fonksiyonu ile birlikte veya bir düzenli ifade string'i içinde kullanılabilir. İşte kullanım örnekleri:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">re</span>
<span class="c1"># `re.compile()` ile kullanım</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+'</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">"""Python</span>
<span class="s2">is</span>
<span class="s2">awesome"""</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="c1"># ['Python', 'is', 'awesome']</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">text</span> <span class="o">=</span> <span class="s2">"""Python</span>
<span class="s2">is</span>
<span class="s2">awesome"""</span>
<span class="c1"># Düzenli ifade içinde kullanım</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s1">'^\w+'</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</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">'Python'</span><span class="p">,</span> <span class="s1">'is'</span><span class="p">,</span> <span class="s1">'awesome'</span><span class="p">]</span>
</code></pre></div>
<p>Bu örneklerde, <code>re.MULTILINE</code> bayrağı kullanılarak <code>^\w+</code> düzenli ifadesi her satırın başındaki kelimeyi eşleştirmektedir.</p>
<h2>re.DOTALL veya re.S</h2>
<p>Bildiğiniz gibi, metakarakterler arasında yer alan <code>.</code> sembolü herhangi bir karakterin yerini tutuyordu. Bu metakarakter bütün karakterlerin yerini tutmak üzere kullanılabilir. Hatırlarsanız, <code>.</code> metakarakterini anlatırken, <strong>bu metakarakterin, yeni satır karakterinin yerini tutmayacağını</strong> söylemiştik. <code>re.DOTALL</code> veya <code>re.S</code> bayrağı, bir düzenli ifadenin <code>.</code> karakterinin metin içinde yeni satır karakterleriyle de eşleşmesini sağlar. Bunu bir örnek yardımıyla görelim. Diyelim ki elimizde şöyle bir karakter dizisi var:</p>
<div class="highlight"><pre><span></span><code><span class="n">a</span> <span class="o">=</span> <span class="s2">"""Ben Python,</span>
<span class="s2">Monty Python"""</span>
<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>Ben Python,