2013-07-06 45 views
9

Tôi đang cố phân tích nội dung của chuỗi. Nếu nó có dấu chấm câu trong từ tôi muốn thay thế chúng bằng dấu cách.Đang cố gắng đếm các từ trong một chuỗi

Ví dụ: Nếu Johnny.Appleseed! Là: a * tốt & nông dân được nhập làm đầu vào thì cần phải nói có 6 từ, nhưng mã của tôi chỉ thấy nó là 0 từ. Tôi không chắc chắn cách xóa ký tự không chính xác.

FYI: Tôi đang sử dụng python 3, tôi cũng không thể nhập bất kỳ thư viện

string = input("type something") 
stringss = string.split() 

    for c in range(len(stringss)): 
     for d in stringss[c]: 
      if(stringss[c][d].isalnum != True): 
       #something that removes stringss[c][d] 
       total+=1 
print("words: "+ str(total)) 
+3

Bạn đang quá phức tạp điều này. Bạn có thể lặp lại một chuỗi bằng cách sử dụng một vòng lặp bình thường. – squiguy

+0

'd' là một ký tự riêng lẻ của một chuỗi, * không * và chỉ mục. Và bạn không gọi phương thức '.isalnum()', chỉ tham chiếu nó. Và sử dụng 'if not' để kiểm tra âm, chứ không phải'! = True'. –

+0

Và tại sao bạn không thể nhập bất kỳ thư viện nào ...? –

Trả lời

14

đơn giản lặp dựa trên giải pháp:

strs = "Johnny.Appleseed!is:a*good&farmer" 
lis = [] 
for c in strs: 
    if c.isalnum() or c.isspace(): 
     lis.append(c) 
    else: 
     lis.append(' ') 

new_strs = "".join(lis) 
print new_strs   #print 'Johnny Appleseed is a good farmer' 
new_strs.split()   #prints ['Johnny', 'Appleseed', 'is', 'a', 'good', 'farmer'] 

Better giải pháp:

Sử dụng regex:

>>> import re 
>>> from string import punctuation 
>>> strs = "Johnny.Appleseed!is:a*good&farmer" 
>>> r = re.compile(r'[{}]'.format(punctuation)) 
>>> new_strs = r.sub(' ',strs) 
>>> len(new_strs.split()) 
6 
#using `re.split`: 
>>> strs = "Johnny.Appleseed!is:a*good&farmer" 
>>> re.split(r'[^0-9A-Za-z]+',strs) 
['Johnny', 'Appleseed', 'is', 'a', 'good', 'farmer'] 
+1

Làm thế nào regex một giải pháp tốt hơn, là nó nhanh hơn? –

+0

@MarkusMeskanen Tất nhiên, nhanh gấp hai lần. –

+0

Đó thậm chí không phải là giải pháp regex tốt: P –

1
for ltr in ('!', '.', ...) # insert rest of punctuation 
    stringss = strings.replace(ltr, ' ') 
return len(stringss.split(' ')) 
10

Đây là giải pháp một dòng không yêu cầu nhập bất kỳ thư viện nào.
Nó thay thế các ký tự không phải chữ và số (như dấu chấm câu) bằng dấu cách và sau đó là split s chuỗi.

Lấy cảm hứng từ "Python strings split with multiple separators"

>>> s = 'Johnny.Appleseed!is:a*good&farmer' 
>>> words = ''.join(c if c.isalnum() else ' ' for c in s).split() 
>>> words 
['Johnny', 'Appleseed', 'is', 'a', 'good', 'farmer'] 
>>> len(words) 
6 
3

thử điều này: nó phân tích các WORD_LIST bằng thủ tục re, sau đó tạo ra một từ điển của từ: xuất hiện

import re 
word_list = re.findall(r"[\w']+", string) 
print {word:word_list.count(word) for word in word_list} 
1

Tôi biết rằng đây là một câu hỏi cũ nhưng ...Còn cái này thì sao?

string = "If Johnny.Appleseed!is:a*good&farmer" 

a = ["*",":",".","!",",","&"," "] 
new_string = "" 

for i in string: 
    if i not in a: 
     new_string += i 
    else: 
     new_string = new_string + " " 

print(len(new_string.split(" "))) 
1

Cách sử dụng Bộ đếm từ bộ sưu tập?

import re 
from collections import Counter 

words = re.findall(r'\w+', string) 
print (Counter(words)) 
Các vấn đề liên quan