it-swarm.com.de

Bestimmen, wie oft ein Teilstring in einem String in Python vorkommt

Ich versuche herauszufinden, wie oft ein String in einem String vorkommt. Zum Beispiel:

nStr = '000123000123'

Angenommen, die Zeichenfolge, die ich finden möchte, ist 123. Offensichtlich kommt sie in nStr zweimal vor, aber ich habe Probleme, diese Logik in Python zu implementieren. Was ich im Moment habe:

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

Die Antwort, die es zurückgeben sollte, ist 2. Ich stecke momentan in einer Endlosschleife.

Mir wurde gerade bewusst gemacht, dass Zählen eine viel bessere Methode ist, aber aus Neugierde sieht jemand einen Weg, dies ähnlich wie ich bereits getan habe?

45
user1294377

Verwenden Sie str.count :

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

Eine funktionierende Version Ihres Codes:

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

Das Problem mit count() und diesen hier gezeigten Methoden ist der Fall, dass sich Teilzeichenfolgen überlappen.

Zum Beispiel: "aaaaaa".count("aaa") gibt 2 zurück

Wenn Sie möchten, dass 4 [(aaa)aaa, a(aaa)aa, aa(aaa)a, aaa(aaa)] zurückgegeben wird, versuchen Sie Folgendes:

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

Ich weiß nicht, ob es eine bessere Methode gibt, aber nur veröffentlichen, um die Funktionsweise von count() zu klären.

18
João Pesce
import re

pattern = '123'

n =re.findall(pattern, string)

Wir können sagen, dass der Teilstring 'pattern' in (string) mal (n) mal erscheint.

5
Prasanna

Falls Sie suchen, wie Sie dieses Problem für überlappende Fälle lösen können.

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)

Wird zu 3 führen, weil: [azc (bob) obegghaklbob] [azcbo (bob) egghaklbob] [azcbobobegghakl (bob)]

0
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) ist bei Überlappungen nicht sinnvoll.

Mein Ansatz:

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

Sie ändern nicht a mit jeder Schleife. Sie sollten setzen:

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

...anstatt:

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

Wie von @ João Pesce und @gaurav erwähnt, ist count() bei überlappenden Teilstrings nicht sinnvoll. Probieren Sie es aus ...

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