Bir dizgi içindeki Türkçe harfleri değiştirme

Başlatan Erdem, 26 Ocak 2013 - 01:43:47

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Erdem

baglanti = "Çarşıdan aldım bir tane"

sonuc = "carsidan-aldim-bir-tane"


İçinde Türkçe harfler bulunan bir dizgiyi nasıl sadece ASCII karakterler kullanacak şekilde değiştirebilirim. Harfleri de küçük harfe dönüştürüp, boşluklar yerine de tire işareti koymak istiyorum.

Benim ilk planda dizgiyi karakterlerden oluşan bir listeye çevirip sonra tekrar eski haline getirmek geldi.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

egcodes



#Türkçe karakter için
str = str.replace('ş', 's')
#Küçültmek için
str = str.lower()



şeklinde değiştirebilirsin
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

Erdem

Şöyle bir şey denedim:

#!/usr/bin/env python
# -*- coding: utf8 -*-

liste = {"ı": "i",
         "ç": "c",
         " ": "-",
         "ş": "s"}

def baglantiYap(metin):
    for karakter in liste:
        if karakter in metin:
            return metin.replace(karakter, liste[karakter])

baglanti = "Çarşıdan aldım bir tane"

sonuc = baglantiYap(baglanti)

print sonuc


Ama bu şekilde çalışmıyor. Karakterleri unicode olarak tanımlayınca da

Alıntı YapUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

bir hata veriyor.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

egcodes

Bir döngüye gerek yok zaten replace örneğin ı karakteri için hepsini bulup i yapacaktır. Her karakter için bir tane replace yap.



1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

Erdem

#4
Hımm şu şekilde oldu galiba ama benim bunu bir işleve çevirmem gerekiyor:

#!/usr/bin/env python
# -*- coding: utf8 -*-

liste = {"ı": "i",
         "Ç": "c",
         " ": "-",
         "ş": "s"}


metin = 'Çarşıdan aldım bir tane'

for karakter in liste:
    metin = metin.replace(karakter, liste[karakter])

print metin



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 26 Ocak 2013 - 16:03:51

Tamam oldu galiba teşekkürler  ;)

#!/usr/bin/env python
# -*- coding: utf8 -*-

liste = {"ı": "i",
         "Ç": "c",
         " ": "-",
         "ş": "s"}


metin = 'Çarşıdan aldım bir tane'
baska_metin = 'bir tas has hoşaf'

def baglantiYap(metin):
    for karakter in liste:
        metin = metin.replace(karakter, liste[karakter])
    return metin

sonuc = baglantiYap(baska_metin)

print sonuc
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

egcodes





#!/usr/bin/env python
# -*- coding: utf8 -*-


def convertAscii(metin):
liste = {"ı": "i",
"Ç": "c",
" ": "-",
"ş": "s"}


for karakter in liste:
metin = metin.replace(karakter, liste[karakter])
return metin


baglanti = "Çarşıdan aldım bir tane"


print convertAscii(baglanti)



1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sem

ilk iterasyonda return uyguluyorsunuz, şöyle olmalıu



#!/usr/bin/env python
# -*- coding: utf8 -*-


liste = {"ı": "i",
         "ç": "c",
         "Ç": "C",
         " ": "-",
         "ş": "s"}


def baglantiYap(metin):
    for karakter in liste:
        if karakter in metin:
            metin =  metin.replace(karakter, liste[karakter])
    return metin


baglanti = "Çarşıdan aldım bir tane"


sonuc = baglantiYap(baglanti)


print sonuc

".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Teşekkürler  :)

Şimdi çalışıyor. @egcodes'un da belirttiği gibi sadece bir döngü yeterli oluyor.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

heartsmagic

Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

fghty

Dönüştürme işlemi ord() ve unichr() fonksiyonları kullanılarak da yapılabilir mi?

Erdem

#10
Python, beautifulsoup ve bootstrap üçlüsüyle bir şeyler yapıyorum. Hala bitmedi. Merak edenler bakabilir.

http://www.temelelektronik.net/eagle

Aslında çözülmemişti. Gene aynı hatayı verdi ama programı şu şekilde düzenleyince çözüldü  :D

# bağlantı yap
def baglantiYap(metin):
    liste = {"ı": "i",
             "I": "ı",
             "Ç": "c",
             "ç": "c",
             " ": "-",
             "ş": "s",
             "Ş": "s",
             "Ğ": "g",
             "ğ": "g",
             "Ü": "u",
             "ü": "u",
             "Ö": "o",
             "ö": "ö"}

    metin = metin.encode('utf8', 'replace')
    for karakter in liste:
        metin = metin.replace(karakter, liste[karakter])
    return metin.lower()


@fghty ben de çok az Python biliyorum. O yüzden işlevlerini bile buradaki arkadaşlardan öğreniyorum  ;)
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

fantastik51

Bu işlem için bu kadar uğraşmaya ve tekerleği yeniden icat etmeye gerek yok.
Python bize zaten bu işlem için bir araç sunuyor. Karakter dizilierinin translate metodu bu işi görür gibime geliyor:

# Metni bağlantı olarak kullanabilmek için Türkçe karakterlerden ve boşluktan arındırır.
def baglantiYap(metin):
    liste = str.maketrans("ÇĞİÖŞÜçğıöşü ", "CGIOSUcgiosu-")

    metin = metin.translate(liste)
    return metin.lower()

Karakter dizilerinin translate() metodunu kullanmak için yine karakter dizilerinin maketrans() metodu kullanılır. Bu metot değişecek karakterlerin sayısal değerlerinden oluşan bir sözlük döndürür. Bu sözlük translate() metodu tarafından kullanılır.

NOT: maketrans metodu Python 2.x sürümlerinde string modülünün bir parçasıdır. Aynı kod 2.x de şöyle yazılabilir:

# Metni bağlantı olarak kullanabilmek için Türkçe karakterlerden ve boşluktan arındırır.
import string # ! string modülü dahil ediliyor.

def baglantiYap(metin):
    liste = string.maketrans("ÇĞİÖŞÜçğıöşü ", "CGIOSUcgiosu-") # ! str yerine bu modül kullanılıyor.

    metin = metin.translate(liste)
    return metin.lower()


Karakter dizilerinin bu metodlarıyla ilgili daha fazla bilgi için:
http://belgeler.istihza.com/py3/karakter_dizilerinin_metotlari3.html#karakter-dizilerinin-metotlari-devami
http://www.istihza.com/py2/kardiz.html#translate-metodu