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?
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)
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.
import re
pattern = '123'
n =re.findall(pattern, string)
Wir können sagen, dass der Teilstring 'pattern' in (string) mal (n) mal erscheint.
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)]
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)
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
Sie ändern nicht a
mit jeder Schleife. Sie sollten setzen:
a += nStr[a:].find(pattern)+1
...anstatt:
a = nStr[a:].find(pattern)+1
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