2012-03-21 31 views
5

kullanarak çeşitli noktalama işaretlerine bölme Bir dizeyi sözcüklere bölme, boşlukları ve noktalama işaretlerini kaldırma.Bir dize bölme()

Ben bir kerede tüm noktalama geçen split() yöntemi kullanılarak çalıştı, ancak benim sonuçlar hatalıydı:

>>> test='hello,how are you?I am fine,thank you. And you?' 
>>> test.split(' ,.?') 
['hello,how are you?I am fine,thank you. And you?'] 

Aslında zaten regexes ile bunun nasıl biliyorum ama anlamaya istiyorum split() kullanarak nasıl yapılır. Lütfen bana bir regex çözümü vermeyin.

+2

Çekiç elinizde iken bir çiviyi sürmek için bir anahtar kullanarak ısrar ediyorsunuz. Niye ya? –

+0

OP'ye herhangi bir saygısızlık göstermeksizin, uygun araçların hangi sebepten dolayı (bazen geçerli), zaman zaman ortaya çıktıkları bu tür soruların bir etiketi olmalıdır. Belki de 'luddizm'? –

+0

C# "merhaba, nasılsınız? Ben iyiyim, teşekkür ederim. Ve sen?" Bölünmüş (",". ". ToCharArray(), StringSplitOptions.RemoveEmptyEntries); –

cevap

10

Bu yeniden modül kullanmadan aklıma gelen en iyi yoldur Sen .split() kullanımını genişletmek için bir fonksiyon yazabiliriz:

def multi_split(s, seprators): 
    buf = [s] 
    for sep in seprators: 
     for loop, text in enumerate(buf): 
      buf[loop:loop+1] = [i for i in text.split(sep) if i] 
    return buf 

Ve bunu denemek:

>>> multi_split('hello,how are you?I am fine,thank you. And you?', ' ,.?') ['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you']

Bu daha anlaşılır olacak ve diğer durumlarda kullanılabilir.

+0

Ooo, bunu yapmanın başka bir yolu, ancak bölünmüş karakterlerin açık listesini kullanmasa da ... – larsks

+0

kodunuz daha iyidir, diğer noktalama işaretlerini işleyebilir – leisurem

+0

Bu harika. Yine de, re.split kullanmaya kıyasla biraz daha az verimlidir. –

11

Eğer sınırlayıcı, sizin örnekte olduğu gibi, bu gibi, tuhaf itirazlarına rağmen re modülü kullanmak ihtiyacımız olacak katına dayanan bir dize bölmek isterseniz:

>>> re.split('[?.,]', test) 
['hello', 'how are you', 'I am fine', 'thank you', ' And you', ''] 

O var , split kullanarak benzer bir sonuç elde etmek için, ancak her karakter için bir kez bölünme çağırmanız gerekir ve önceki bölünmenin sonuçları üzerinde yinelemeniz gerekir. Bu işler ancak u-g-l-y var:

>>> sum([z.split() 
... for z in sum([y.split('?') 
... for y in sum([x.split('.') 
... for x in test.split(',')],[])], [])], []) 
['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you'] 

Bu önceki yineleme tarafından döndürülen liste düzleştirmek sum() kullanır.

test.replace(',',' ').replace('.',' ').replace('?',' ').split() 
+0

Lütfen listelerin listesini düzleştirmek için 'sum()' seçeneğini kullanmayın - [bu amaç için yanlış bir araçtır] (http://stackoverflow.com/questions/952914/making-a-flat-list-out- of-listesinde-listeleri-içinde-pitonun/952952 # 952952). Bu durumda, daha da önemlisi, [bir iç içe döngü kullanarak tek bir liste anlama] (http://ideone.com/xEXX7), ilk etapta düzleşmenin gerekliliğini ortadan kaldıracaktır. –

+0

Soruna daha uygun olduğuna inanıyorsanız alternatif bir çözüm göndermekten memnuniyet duyarsınız. – larsks

+0

OP niçin kullanılmaması gerektiğini açıklamıyorsa, henüz sorunun cevabını anlamadığım için cevap vermeyeceğim. Son yorumumdaki ikinci bağlantı, alternatif bir çözüm olsa da. –

6

, bu kullanabilirsiniz:

+0

test = 'Merhaba, nasılsınız? Ben iyiyim, teşekkürler. Ya sen?' test x : değilse x.isalpha(): Test = test.replace (x,' ') Test = test.split() baskı testi – leisurem

3

: Eğer yeniden modülünü kullanmak istemiyorsanız bu yana

"".join((char if char.isalpha() else " ") for char in test).split() 
3

tüm noktalama karakterleri kendiniz yazmanız gerekmez larsks' cevabı, modifiye edilmiş bir versiyonu: necroing için

import re, string 

re.split("[" + string.punctuation + "]+", test) 
['hello', 'how are you', 'I am fine', 'thank you', ' And you', ''] 
0

Özür - Konuyu olmayan regex yarma için ilk sonucu olarak ortaya çıkıyor bir cümle. Öğrencilerim için Python'a özgü olmayan bir yöntemle geldiğimi ve bu iş parçamın soruma cevap vermediğimi düşündüğümde, olayın hemen ardından paylaşacağımı düşündüm.

kod noktası (ve büyük dosyalar üzerinde çabuk) hiçbir kütüphaneleri kullanmaktır

:

sentence = "George Bernard-Shaw was a fine chap, I'm sure - who can really say?" 
alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
words = [] 
word = "" 
mode = 0 
for ch in sentence: 
    if mode == 1: 
     words.append(word) 
     word = "" 
     mode = 0 
    if ch in alpha or ch == "'" or ch == "-": 
     word += ch 
    else: 
     mode = 1 
words.append(word) 
print(words) 

Çıktı:

['George', 'Bernard-Shaw', 'was', 'a', 'fine', 'chap', "I'm", 'sure', '-', 'who', 'can', 'really', 'say'] 

ben gerçekten sadece yaklaşık yarım saat içinde bu yazdım Bu yüzden mantığın temizlenebileceğine eminim.Ayrıca, kullanımı ters çevrilmiş virgül gibi bir şeyle karşılaştırıldığında tutarsız olduğu için tire gibi uyarılarla başa çıkmak için ek mantık gerektirebileceğini de kabul ettim. Gerçekten de, bunu doğru bir şekilde yapan herhangi bir modül var mı?

İlgili konular