web-dev-qa-db-ja.com

Pythonで文字列に部分文字列が出現する回数を決定する

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

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です。現時点では無限ループに陥っています。

私はちょうどカウントがそれを行うためのはるかに優れた方法であることを認識しましたが、好奇心から、誰かが私がすでに持っているものと同じようにそれを行う方法を見ていますか?

54
user1294377

つかいます - 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)
79

ここに示されているcount()とこれらのメソッドの問題は、部分文字列が重複している場合です。

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

4 [_(aaa)aaa, a(aaa)aa, aa(aaa)a, aaa(aaa)_]を返すようにするには、次のようなものを試してください。

_def my_count(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

my_count("aaaaaa", "aaa")
# 4
_

より良い方法があるかどうかはわかりませんが、count()の動作を明確にするためだけに投稿してください。

19
João Pesce
import re

pattern = '123'

n =re.findall(pattern, string)

部分文字列「パターン」が「文字列」にlen(n)回出現すると言うことができます。

5
Prasanna

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

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

1
TawabG
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)
0
Priyanka Kumari

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
0
gaurav parashar

各ループでaを変更していません。あなたが置く必要があります:

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

...の代わりに:

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

@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
0
Aditya Patnaik