2013-07-06 7 views
9

文字列の内容を分析しようとしています。単語に句読点が混在している場合は、スペースで置き換えます。文字列内の単語を数えようとしています

たとえば、Johnny.Appleseed!が:a * good &農家を入力として入力した場合、6単語があると言えますが、私のコードでは0ワードと見なされます。間違った文字を削除する方法がわかりません。

FYI:私はまた、私は任意のライブラリをインポートすることができない、のpython 3を使用してい

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

あなたはこれを過度に複雑にしています。通常のforループを使用して文字列を反復することができます。 – squiguy

+0

'd'は文字列の個々の文字で、* not *とindexです。そしてあなたは '.isalnum()'メソッドを呼び出すのではなく、それを参照するだけです。 '!= True'ではなく、' 'not ''を使って否定的にテストしてください。 –

+0

そして、なぜライブラリをインポートできないのですか? –

答えて

14

単純なループベースのソリューション:

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'] 

よりよい解決策:

使用方法: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

正規表現はどのように優れたソリューションですか? –

+0

@ MarkusMeskanenもちろん、ほぼ2倍の速さです。 –

+0

それは良い正規表現の解でもありません:P –

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

ここには、ライブラリをインポートする必要がない1行のソリューションがあります。
英数字以外の文字(句読点など)をスペースで置き換えてから、split文字列を置き換えます。 「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

からインスピレーションを受け

はこれを試してみてください。それは、単語の辞書を作成した後、再使用してWORD_LISTを解析する:出演

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

私は、これは古い問題であることを知っているが、 ...これはどう?

1

コレクションからカウンタを使用することはどうですか?

import re 
from collections import Counter 

words = re.findall(r'\w+', string) 
print (Counter(words)) 
関連する問題