81

文字列内で文字列が何回発生するかを把握しようとしています。例えば:

nStr = '000123000123'

私が見つけたい文字列が123だとしましょう。明らかにnStrで2回発生しますが、このロジックをPythonに実装するのに問題があります。私が今持っているもの:

pattern = '123'
count = a = 0
while pattern in nStr[a:]:
    a = nStr[a:].find(pattern)+1
    count += 1
return count

返されるはずの答えは2です。私は現在、無限ループに陥っています。

カウントはそれを行うためのはるかに優れた方法であることに気づきましたが、好奇心から、私がすでに持っているものと同様の方法を誰かが見ていますか?

4

13 に答える 13

114

使用str.count

>>> nStr = '000123000123'
>>> nStr.count('123')
2

コードの動作バージョン:

nStr = '000123000123'
pattern = '123'
count = 0
flag = True
start = 0

while flag:
    a = nStr.find(pattern, start)  # find() returns -1 if the word is not found, 
    #start i the starting index from the search starts(default value is 0)
    if a == -1:          #if pattern not found set flag to False
        flag = False
    else:               # if word is found increase count and set starting index to a+1
        count += 1        
        start = a + 1
print(count)
于 2012-07-13T19:00:57.667 に答える
32

count()ここに示されているおよびその他のメソッドの問題は、サブストリングがオーバーラップしている場合です。

例:"aaaaaa".count("aaa")2を返します

(aaa)aaa, a(aaa)aa, aa(aaa)a, aaa(aaa)4 [ ]を返したい場合は、次のようにしてみてください。

def count_substrings(string, substring):
    string_size = len(string)
    substring_size = len(substring)
    count = 0
    for i in xrange(0,string_size-substring_size+1):
        if string[i:i+substring_size] == substring:
            count+=1
    return count

count_substrings("aaaaaa", "aaa")
# 4

より効率的な方法があるかどうかはわかりませんが、これでどのように機能するかが明らかになることを願っていcount()ます。

于 2013-06-05T03:49:15.413 に答える
6
import re

pattern = '123'

n =re.findall(pattern, string)

サブストリング「パターン」は「ストリング」にlen(n)回出現すると言えます。

于 2012-07-16T05:18:10.643 に答える
4

重複するケースについてこの問題を解決する方法を探している場合。

s = 'azcbobobegghaklbob'
str = 'bob'
results = 0
sub_len = len(str) 
for i in range(len(s)):
    if s[i:i+sub_len] == str: 
        results += 1
print (results)

次の理由で3になります:[azc(bob)obegghaklbob] [azcbo(bob)egghaklbob] [azcbobobegghakl(bob)]

于 2019-06-07T17:36:40.477 に答える
1

私はかなり新しいですが、これは良い解決策だと思いますか?多分?

def count_substring(str, sub_str):
    count = 0
    for i, c in enumerate(str):
        if sub_str == str[i:i+2]:
            count += 1
    return count
于 2019-09-14T00:47:46.820 に答える
0

string.count(substring)は、重複している場合には役立ちません。

私のアプローチ:

def count_substring(string, sub_string):

    length = len(string)
    counter = 0
    for i in range(length):
        for j in range(length):
            if string[i:j+1] == sub_string:
                counter +=1
    return counter
于 2017-02-16T10:56:44.167 に答える
0

aループごとに変更することはありません。あなたは置くべきです:

a += nStr[a:].find(pattern)+1

...それ以外の:

a = nStr[a:].find(pattern)+1
于 2018-01-04T04:07:26.250 に答える
0
def count_substring(string, substring):
         c=0
         l=len(sub_string)
         for i in range(len(string)):
                 if string [i:i+l]==sub_string:
                          c=c+1
         return c
string=input().strip()
sub_string=input().strip()

count= count_substring(string,sub_string)
print(count)
于 2018-10-23T15:13:22.940 に答える
0

@JoãoPesceと@gauravが述べたようcount()に、部分文字列が重複している場合は役に立ちません。これを試してみてください...

def count_substring(string, sub_string):
    c=0
    for i in range(len(string)):
        if(string[i:i+len(sub_string)]==sub_string):
            c = c+1
    return c
于 2019-02-11T12:44:19.200 に答える
0
def countOccurance(str,pat):
    count=0
    wordList=str.split()
    for word in wordList:
        if pat in word:
            count+=1
    return count
于 2019-04-22T09:13:01.150 に答える
0

通常、私はこの種の問題に列挙を使用しています:

def count_substring(string, sub_string):
        count = 0
        for i, j in enumerate(string):
            if sub_string in string[i:i+3]:
                count = count + 1
        return count
于 2020-04-23T02:25:45.127 に答える
-1

def count(sub_string、string):

count = 0
ind = string.find(sub_string)

while True:
    if ind > -1:
        count += 1
        ind = string.find(sub_string,ind + 1)
    else:
        break
return count
于 2020-06-09T07:02:53.350 に答える
-1
def count_substring(string, sub_string):
    count = 0
    len_sub = len(sub_string)
    for i in range(0,len(string)):
        if(string[i:i+len_sub] == sub_string):
            count+=1
    return count
于 2021-12-19T22:53:01.763 に答える