2013-06-24 7 views
10

文字列内の単語の出現回数を調べようとしています。pythonで文字列内の単語の出現を調べる3

word = "dog" 
str1 = "the dogs barked" 

私は、発生をカウントするために、次を使用:

count = str1.count(word) 

問題は、私は完全に一致をしたいです。したがって、この文の数は0になります。 これは可能ですか?

答えて

16

あなたは効率のために行っている場合:

import re 
count = sum(1 for _ in re.finditer(r'\b%s\b' % re.escape(word), input_string)) 

これは(split()とは違って)任意の中間リストを作成する必要はありませんので、大きなinput_string値のために効率的に動作します。

"Mike saw a dog."(ただし、引数なしsplit()はそうではありません)のカウントとして正しく1が返されます。単語境界(\w a.k.a [a-zA-Z0-9_]とそれ以外の間の遷移)と一致する正規表現フラグ\bを使用します。

ASCII文字セット以外の言語について心配する必要がある場合は、正規表現をそれらの言語の単語以外の文字と正しく一致するように調整する必要があるかもしれませんが、多くのアプリケーションではこれは過多です。正規表現のUnicodeフラグやロケールフラグを設定すれば十分です。

+0

は魅力的に働いた!どうしてdownvoteがあるのか​​分かりません。あなたは正確に何が起こっているのか、私はこれを探すことができるのかを説明できますか?私はアンダースコアのforループを見たことがありません。ありがとう! – lost9123193

+0

@ lost9123193 '_'はforループのプレースホルダとしてよく使われます:)。私はアンバーがもっとうまく説明できると確信しています:p – TerryA

+1

@ lost9123193 - '_'は単純にダミー変数です。「私は実際にここで値を気にしません」という表現です。この場合、私は常にカウントを '1'に集計しているので、私はそれを使用しています。我々は 're.finditer()'から返されたマッチオブジェクトを実際に気にしません。 – Amber

3

は、リストの内包を使用します。

文のすべての単語のリストを返します split()
>>> word = "dog" 
>>> str1 = "the dogs barked" 
>>> sum(i == word for word in str1.split()) 
0 

>>> word = 'dog' 
>>> str1 = 'the dog barked' 
>>> sum(i == word for word in str1.split()) 
1 

。次に、リスト内包表記を使用して、単語が1つの文に何回出現するかを数えます。

+1

へ。 – Amber

+0

@LennartRegebroあなたは答えを下降させるべきではありません。答えは正しいです – TerryA

+0

@LennartRegebroそれは有用な声明ではありません。 StackOverflowで回答を投稿する人は、質問を投稿する人と同じくらい多くのことを学びたいと思うことがあります。有用で実行可能なフィードバックは、その重要な部分です。 – Amber

8

あなたは単語のリストに文を変換するstr.split()を使用することができます。

a = 'the dogs barked'.split() 

これは、リストを作成します。

['the', 'dogs', 'barked'] 

その後、list.count()を使用して、正確な出現回数を数えることができます。

a.count('dog') # 0 
a.count('dogs') # 1 

句読点を使用する必要がある場合は、あなたは正規表現を使うことができます。例:

import re 
a = re.split(r'\W', 'the dogs barked.') 
a.count('dogs') # 1 
+0

これはおそらく最も簡単な方法ですが、カウントされた単語の隣に句読点が含まれている文字列では失敗することに注意してください。 – Amber

+0

"\ W"正規表現は、カフェなどの外国語の場合には失敗しますが、これは欠点です。 –

+0

@LennartRegebroはユニコードフラグでそれを修正しませんか? – grc

2

文章を単語に分割する必要があります。あなたたとえば、あなたがちょうど

words = str1.split() 

しかし、本当の単語の使用のためにあなたにも句読点を処理する、より高度なものが必要であることを行うことができます。ほとんどの西洋言語では、str1.split()を実行する前に、すべての句読点をスペースで置き換えることができます。

これは英語でも簡単なケースでは機能しますが、「私」は「I」と「m」の2つの単語に分割され、実際には「I」と"am"。しかし、これはこのアプリケーションにとっては過度のことかもしれません。

アジア言語や実際の英語の使用などの場合は、単語分割を行うライブラリを使用することをおすすめします。

次にあなたが単語のリストを持っている、とあなたは以下

count = words.count(word) 
+0

ハハ、これは何の理由もないのに、下降してしまった。私は幼稚さを疑う。 ;-)しかし、私はすでに20k以上持っているので、私は気にしない、downvote。 –

+0

ちょうど今それを言うつもり、私はdownvoteしなかった。 – TerryA

+0

OK、それを聞いてうれしいです。 –

2
import re 

word = "dog" 
str = "the dogs barked" 
print len(re.findall(word, str)) 
0

を行うことができますが、我々は新しい言葉と希望の単語を交換し、また発生の所望の数のためにできる簡単な例です。

import string 

def censor(text, word):<br> 
    newString = text.replace(word,"+" * len(word),text.count(word)) 
    print newString 

print censor("hey hey hey","hey") 

出力は次のようになります+++ +++ +++

最初のパラメータ機能はsearch_stringです。 もう1つは、あなたのsearch_stringを置き換えるnew_stringです。 3番目と最後は発生回数です。

+0

何のために
? – RetroCode

0

s = "suvotisuvojitsuvo"の例を考えてみましょう。 別のカウント "suvo"と "suvojit"をカウントしたくない場合は、count()メソッドを使用します。count distinct:suvojitをsuvojitに数えません..孤独な "suvo" 。

suvocount = s.count("suvo") // #output: 3 
suvojitcount = s.count("suvojit") //# output : 1 

次にsuvojitカウントから否定する必要がある孤独なsuvoカウントを見つけます。

lonelysuvo = suvocount - suvojicount //# output: 3-1 -> 2 
0

これは、コメントの助けを借りて、私の解決策になる:あなたはdownvoteするつもりなら、それは通常、少なくとも理由を説明するコメントを残すことをお勧めします。これをdownvoted誰

word = str(input("type the french word chiens in english:")) 
str1 = "dogs" 
times = int(str1.count(word)) 
if times >= 1: 
    print ("dogs is correct") 
else: 
    print ("your wrong") 
関連する問題