2016-03-19 13 views
0

Bir dosyayı okumaya ve içinde 6 karakterden oluşan sözcükleri eşleştirmeye çalışıyorum. ancak bu hatayı almaya devam ediyorum: Python: kelimeleri regex ile eşleştirmeye ve saymaya çalışın (beklenen dize veya arabellek)

Traceback (most recent call last): 
    File "dummy.py", line 9, in <module> 
    matches = re.findall("\w{6,}", f.read().split()) 
    File "/usr/lib/python2.7/re.py", line 181, in findall 
    return _compile(pattern, flags).findall(string) 
TypeError: expected string or buffer 
Ve bu hatayı neden aldığımı anlayamıyorum? Kod


import re 

with open('test.txt', 'r') as f: 
    matches = re.findall("\w{6,}", f.read().split()) 
    nr_long_words = len(matches) 
    print (matches) 
+0

bu bir hatadır. Bu sadece bir yazım hatasıydı ........ baskı (eşleşme) yerine baskı (eşleşme) kullanıldı ve katma değer eklendi .split() –

cevap

1

f.read().split() dizeleri listesini verir aşağıda yapıştırıldığında, ancak re.findall böylece TypeError: expected string or buffer tek bir sicim, bekliyor. Bir döngü veya liste anlama alt dizeleri her sağlamak için normal ifadeler geçerli olabilir, ama hiç split() gerekmez: dosyası çok büyükse, o zaman f.read() iyi olmayabileceğini

matches = re.findall("\w{6,}", f.read()) 

Not fikir (ama metin dosyaları için muhtemelen bir sorun değildir, çünkü bunlar nadiren birkaç megabayttan daha azdır). Bu durumda, dosya line-by-line okumak ve satır başına uzun kelimeleri özetlemek olabilir: Açıklamalarda belirtildiği gibi

nr_long_words = sum(len(re.findall(r"\w{6,}", line)) for line in f) 

Ayrıca, \w{6,} "uzun kelimeler" için en uygun regex olmayabilir ile başla. \w, örneğin, aynı sayıları veya alt çizgi olan _'u da içerecektir. Yalnızca (ascii-) harfleri eşleştirmek istiyorsanız, [A-Za-z]'u kullanın, ancak bu, ara sıra harfler, aksanlar, arapça vb. Gibi ascii olmayan harflerle ilgili sorunlara neden olabilir. Ayrıca, kelime sınır karakterleri eklemek isteyebilirsiniz, örneğin \b yani böyle bir normal ifadeler kullanabilirsiniz, altı harf daha uzun olmayan kelime dizisinin bir parçası değildir emin olmak için r'\b[A-Za-z]{6,}\b'

+0

Will \\ [A-Za-z] {6,} \ b ** kelimelerin eşleşmesi için kullanılacak doğru regex olmalıdır **? –

+0

@noob Bu konuya biraz ekleme yapmayı düşündüm: Bu '\ w {6,} 'ayrıca" word "kelimesiyle daha uzun, kelime olmayan bir dizinin eşleşmesi olabilir. –

+0

Şimdiye kadarki yardım ve büyük açıklama için teşekkürler! Geride bıraktığım tek sorun, regex'in æøå-ÆØÅ ile kelimeleri tespit etmemesi mi? Bunu nasıl ekleyebilirim? –

0

Dene:

import re 

nr_long_words = 0 

with open('input.txt', 'r') as f: 
    for line in f: 
     matches = re.findall("\w{6,}", line) 
     nr_long_words += len(matches) 

    print(nr_long_words) 

o 6 karakterden daha uzun kelimelerin sayısını yazdırmalısınız dosya.