Düzenli İfadelerle İlgili Bir Soru?

Merhabalar düzenli ifadeler ile bir sitedeki tüm linkleri çekiyorum yaptım fakat mantığını çözmek istiyorum yoksa bir yerden okuyup herkes yapar önemli olan mantık…Şöyle Bir Kod Yazdım Fakat nesne=re.findall('<a href="(.*?)"',sitekod) şu kısımdaki (.?) nin mantığı nasıl çalışıyor? . tüm karakterler demek fakat ? kendisinden önceki harfin bir kere veya hiç olmamış halini almak değil mi?

site="http://www.sedimental.com/"
r=requests.get(site)

sitekod=r.text
liste2=[]

liste=[]
sayi=0
sayi1=1
title=input("Title Çekilsin mi: ")
while sayi<sayi1:
    nesne2 = re.findall('<title>(.*)</title>', sitekod)
    if title=="E":
        print("Site Title'ı: ",nesne2[0])
    nesne=re.findall('<a href="(.*?)"',sitekod)
    for i in nesne:


        if not "http://" in i:

            liste.append(site+i)
        else:
            liste.append(i)




    sayi+=1

print(liste2)
print(liste)

Aynen öyle. Bu düzenli ifadede bir yanlışlık var. Soru işareti olmamalı ya da \ karakteri ile kaçırılmış olmalı. Zaten şuraya yazdım düzenli ifadeyi; hatalı olduğunu söylüyor: regex101: build, test, and debug regex

Bende soruyu görünce kalıbın ne işe yaradığını anlamadım ve internette araştırdım burada güzel bir şekilde açıklanmış mesele :blush:
Burada kullanılan soru işaretini anlamı tüm karakterlerle olabildiğince az eşleş demek ama a elementinde kullanmak ne kadar etkili bilmiyorum.
Bahsettiğim sitedeki kodlarla örnek verecek olursam:

# "<.+>" kalıbımız bu olsaydı, karakter dizisi içinden yalnızca tagları almak isteseydik
>>> pattern=re.compile("<.+>")

# ve bu kalıbı aşağıdaki gibi bi karakter dizisi içinde arasaydık 
>>> a = re.search(pattern,"This is a <EM> first </EM> test.")
>>> a[0]
'<EM> first </EM>'
#Bizim istediğimiz gibi bir eşleşme olmayacaktı...

# + metakarakteri "This is a <EM> first </EM> test." içindeki tüm karakterlerle eşleşip
#karakter dizinin sonuna geldiğinde '>' karakterini bulamadığını farkediyor ve tek tek 
#geriye doğru '>' karakterini bulana kadar her karakteri kontrol edip '>' karakterini bulduğunda duruyor.

#Ama yukarıdaki düzenli ifade kalıbıyla ararsak:
>>> pattern=re.compile("<.+?>")
>>> a = re.search(pattern,"This is a <EM> first </EM> test.")
>>> a[0]
'<EM>'

#yukarıda da soru işareti, artıya olabildiğince az eşleşmesini söylüyor, artı da 
#1 ya da daha fazla karakterle eşleşeceği için E harfi ile eşleşiyor ve sonraki karakterin
#'>' olup olmadığını kontrol ediyor, sonraki karakterin M olduğunu görünce
#eşleşmeye M harfini ekliyor. Tekrar sonraki karakterin '>'  ile eşleşip eşleşmediğine 
#bakıyor ve eşleştiğini görünce duruyor

#Bu arada "<[^>]+>" kalıbı  "<.+?>" ile aynı işi daha hızlı şekilde görüyormuş.
>>> pattern=re.compile("<[^>]+>")
>>> a=re.search(pattern,"This is a <EM> first </EM> test.")
>>> a[0]
'<EM>'

Ama dediğim gibi yukarıda a elementi için bu kalıbı kullanmak ne kadar doğru bilmiyorum, bu elementi
<a href=“www.website.com” ve “karakter dizisi”>
şeklinde kullanırsak ancak ? metakarakterinin farkını göreceğimizi düşünüyorum.

Cevap biraz uzun oldu ama ancak aklımdakini açıklayabildim kusura bakmayın :slight_smile:

Ama Şöyle Bir Sorun Var “?” kullanmazsam ise hrefleri tam çekmiyor sıkıntılı çekiyor…

Soru İşaretsiz:

Site Title’ı: Sedimental Records

['http://www.sedimental.com/../index.php">Sedimental RecordsSafari

Soru İşaretli:

Title Çekilsin mi: E
Site Title’ı: Sedimental Records

[‘http://www.sedimental.com/../index.php’, ’

Sanırım Mantığı Anladım…Şimdi .* derken bütün karakterleri seçiyoruz ve bütün linkler / ile bitiyor ? işaretide /ın olmadığı ve olduğu durumları alıyor oda yok bulamıyor ve bu yüzden tüm linkleri tek çıktılı veriyor…

Bu iş için Beautiful Soup kullansanız işiniz kolaylaşır.

Bu hata tırnaktan dolayıymış. ? karakterinin buradaki kullanımı doğru. @kdr-6, örneğinde gayet iyi açıklamış.

Durum böyle olmayabilir. @kdr-6’nın cevabına bakın.