Was meinst du mit "Anzahl der Teilzeichenfolgen"? Die Position des Teilstrings? Wie oft kommt der Teilstring vor? Etwas anderes?
GreenMatt
2
Ist das eine Hausaufgabe? Wenn ja, fügen Sie Ihrer Frage bitte den Tag "Hausaufgaben" hinzu. Auch Ihre Frage ist nicht sehr klar. Ich werde antworten, was Sie zu fragen scheinen, aber ich vermute, Sie möchten wirklich etwas anderes herausfinden.
Wie in den Kommentaren erwähnt, ist dies der Weg, um dies bei nicht überlappenden Ereignissen zu tun . Wenn Sie überlappende Vorkommen zählen müssen, überprüfen Sie die Antworten besser unter: " Python-Regex findet alle überlappenden Übereinstimmungen? " Oder überprüfen Sie einfach meine andere Antwort unten.
Was ist damit: Was "GCAAAAAG".count("AAA")gibt 1, während die richtige Antwort 3 ist?
Karikaturist
12
countist offensichtlich für nicht überlappende Spiele - was meistens das ist, was man tun möchte. stackoverflow.com/questions/5616822/… befasst sich mit überlappenden Übereinstimmungen - aber ein einfacher, wenn auch teurer Ausdruck lautet:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
jsbueno
Ist es möglich, mehrere Wörter gleichzeitig zu zählen / zu suchen? wie string.count (Teilzeichenfolge1, Teilzeichenfolge2)
Sushant Kulkarni
@SushantKulkarni Nein. Obwohl es einen logischen Weg gibt, so etwas zu tun : string.count(substring1) + string.count(substring2). Beachten Sie jedoch, dass dies keine effiziente Methode ist, wenn viele Teilzeichenfolgen vorhanden sind, da für das Zählen der einzelnen Teilzeichenfolgen eine Iteration über die Hauptzeichenfolge erforderlich ist.
Faheel
@SushantKulkarni ''.join([substring1, substring2]).count(pattern)ist effizienter als die oben vorgeschlagene Lösung. Ich habe mit timeit nachgesehen.
Enric Calabuig
23
s ='arunununghhjj'
sb ='nun'
results =0
sub_len = len(sb)for i in range(len(s)):if s[i:i+sub_len]== sb:
results +=1print results
Eine zusätzliche Erklärung würde Ihre Antwort verbessern.
Ryanyuyu
19
Je nachdem, was Sie wirklich meinen, schlage ich folgende Lösungen vor:
Sie meinen eine Liste von durch Leerzeichen getrennten Unterzeichenfolgen und möchten wissen, wie die Positionsnummer der Unterzeichenfolge unter allen Unterzeichenfolgen lautet:
s ='sub1 sub2 sub3'
s.split().index('sub2')>>>1
Sie meinen die Zeichenposition der Unterzeichenfolge in der Zeichenfolge:
s.find('sub2')>>>5
Sie meinen die (nicht überlappende) zählt der Auftritt eines su-bstring:
Ich denke du meinst s.find("su")und fragst dich warum du bekommst 0? Nun, dies ist der erste Index der Unterzeichenfolge "su"in s. Versuchen Sie "ub"und Sie werden bekommen 1, versuchen Sie zB "z"und Sie werden -1wie in keinem Teilstring gefunden.
Don Frage
Ich meine, Sie finden immer nur den ersten Index, aber nicht alle Indizes. @ Arun-kumar-khattri gab die richtige Antwort
obohovyk
Ich bin erleichtert, dass @ arun-kumar-khattri die "richtige" Antwort gegeben hat, nach der Sie gesucht haben. Vielleicht sollten Sie sich die Kommentare von jsbueno genauer ansehen, manchmal beantworten sie Fragen, die Sie gerade noch nicht gestellt haben.
Don Frage
Wie beim dritten Ansatz. Übrigens, ich denke, Sie sollten erwähnen, dass es für nicht überlappende Fälle funktioniert.
Zeinab Abbasimazar
12
Der beste Weg, um überlappende Unterzeichenfolgen in einer bestimmten Zeichenfolge zu finden, besteht darin, den regulären Python-Ausdruck zu verwenden, der alle überlappenden Übereinstimmungen mithilfe der Bibliothek für reguläre Ausdrücke findet. Hier ist, wie es gemacht wird. Links ist der Teilstring und rechts geben Sie den passenden String an
Kleiner Tipp: Anstatt "Es funktioniert, weil ich es überprüft habe" zu sagen, können Sie ein Beispiel in einen Onlinedienst wie repl.it mit einigen Beispieldaten aufnehmen.
Valentin
1
Danke für deinen Kommentar Valentin! Es ist meine erste Antwort hier. Ich werde mich von meinen nächsten Antworten verbessern.
Bharath Kumar R
10
Sie können die Häufigkeit auf zwei Arten zählen:
Verwenden des count()in str:
a.count(b)
Oder Sie können verwenden:
len(a.split(b))-1
Wo aist der String und bist der Teilstring, dessen Häufigkeit berechnet werden soll.
Die derzeit beste Antwort mit der Methode countzählt nicht wirklich für überlappende Vorkommen und kümmert sich auch nicht um leere Teilzeichenfolgen. Beispielsweise:
>>> a ='caatatab'>>> b ='ata'>>>print(a.count(b))#overlapping1>>>print(a.count(''))#empty string9
Die erste Antwort sollte 2nicht sein 1, wenn wir die überlappenden Teilzeichenfolgen betrachten. Für die zweite Antwort ist es besser, wenn eine leere Unterzeichenfolge 0 als Antwort zurückgibt.
Brauchen wir diese Prüfung wirklich, wenn (string [j] == sub_string [0]) :? Wird es nicht automatisch in der Folgezeit abgedeckt?
AnandViswanathan89
AnandViswanathan89, Beide, wenn Bedingungen erforderlich sind, wenn (string [j] == sub_string [0]) nach der anfänglichen Zeichenübereinstimmung innerhalb des Hauptstrings sucht, die für die gesamten Zeichen des Hauptstrings ausgeführt werden muss, und if (string [ j: j + len2] == sub_string) führt das Auftreten von Teilzeichenfolgen aus. Wenn es für das erste Auftreten ist, dann das zweite, wenn die Bedingung genügt hätte.
Amith VV
4
Die Frage ist nicht sehr klar, aber ich werde antworten, was Sie an der Oberfläche fragen.
Eine Zeichenfolge S, die L Zeichen lang ist und bei der S [1] das erste Zeichen der Zeichenfolge und S [L] das letzte Zeichen ist, hat die folgenden Teilzeichenfolgen:
Die Nullzeichenfolge ''. Es gibt eine davon.
Für jeden Wert A von 1 bis L, für jeden Wert B von A bis L die Zeichenfolge S [A] .. S [B] (einschließlich). Es gibt L + L-1 + L-2 + ... 1 dieser Zeichenfolgen für insgesamt 0,5 * L * (L + 1).
Beachten Sie, dass der zweite Punkt S [1] .. S [L] enthält, dh die gesamte ursprüngliche Zeichenfolge S.
Es gibt also 0,5 * L * (L + 1) + 1 Teilzeichenfolgen in einer Zeichenfolge der Länge L. Rendern Sie diesen Ausdruck in Python, und Sie haben die Anzahl der Teilzeichenfolgen in der Zeichenfolge.
Eine Möglichkeit ist zu verwenden re.subn. Um beispielsweise die Anzahl der Vorkommen 'hello'in einer beliebigen Mischung von Fällen zu zählen, können Sie Folgendes tun:
import re
_, count = re.subn(r'hello','', astring, flags=re.I)print('Found', count,'occurrences of "hello"')
Wort für mich, danke. @ Santosh, warum nicht eine Antwort akzeptieren?
Mawg sagt, Monica
2
Ich werde meine akzeptierte Antwort als "einfache und offensichtliche Möglichkeit" beibehalten - dies gilt jedoch nicht für überlappende Ereignisse. Das herauszufinden kann naiv erfolgen, indem die Slices mehrfach überprüft werden - wie in: sum ("GCAAAAAGH" [i:]. Startwith ("AAA") für i in range (len ("GCAAAAAGH")))
(was 3 ergibt) - kann dies durch Trick mit regulären Ausdrücken erfolgen, wie bei Python Regex zu sehen ist, finden Sie alle überlappenden Übereinstimmungen? - und es kann auch zu feinem Code-Golfen führen - Dies ist meine "handgemachte" Zählung für überlappende Musterwährungen in einer Zeichenfolge, die versucht, nicht extrem naiv zu sein (zumindest werden bei jeder Interaktion keine neuen Zeichenfolgenobjekte erstellt):
def olpcount(string,pattern,case_sensitive=True):if case_sensitive !=True:
string = string.lower()
pattern = pattern.lower()
l = len(pattern)
ct =0for c in range(0,len(string)):if string[c:c+l]== pattern:
ct +=1return ct
test ='my maaather lies over the oceaaan'print test
print olpcount(test,'a')print olpcount(test,'aa')print olpcount(test,'aaa')
Wie wäre es mit einem Einzeiler mit Listenverständnis? Technisch gesehen sind die 93 Zeichen lang und ersparen mir PEP-8-Purismus. Die Antwort regex.findall ist am besten lesbar, wenn es sich um einen Code auf hoher Ebene handelt. Wenn Sie etwas Niedriges bauen und keine Abhängigkeiten wollen, ist dieses ziemlich schlank und gemein. Ich gebe die überlappende Antwort. Verwenden Sie natürlich nur count wie die Antwort mit der höchsten Punktzahl, wenn es keine Überlappung gibt.
def count_substring(string, sub_string):return len([i for i in range(len(string))if string[i:i+len(sub_string)]== sub_string])
Wenn Sie die Anzahl der Teilzeichenfolgen in einer Zeichenfolge ermitteln möchten; Bitte verwenden Sie den folgenden Code. Der Code ist leicht zu verstehen, deshalb habe ich die Kommentare übersprungen. :) :)
string="abc"
mainstr="ncnabckjdjkabcxcxccccxcxcabc"
count=0for i in range(0,len(mainstr)):
k=0while(k<len(string)):if(string[k]==mainstr[i+k]):
k+=1else:breakif(k==len(string)):
count+=1;print(count)
Vielleicht können Sie näher erläutern, wie sich diese Lösung von der anderen unterscheidet. Gibt es einen Sonderfall, den sie lösen kann?
mpaskov
2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Donald Duck
0
import re
d =[m.start()for m in re.finditer(seaching, string)]print(d)
Hiermit wird ermittelt, wie oft eine Unterzeichenfolge in der Zeichenfolge gefunden wurde, und der Index wird angezeigt.
import re d = [m.start () für m in re.finditer (st3, st2)] # Ermitteln der Häufigkeit, mit der die Unterzeichenfolge in der Zeichenfolge gefunden wurde, und Anzeigen des Indexdrucks (d)
Bhaskar Reddi K
0
my_string ="""Strings are amongst the most popular data types in Python.
We can create the strings by enclosing characters in quotes.
Python treats single quotes the same as double quotes."""Count= my_string.lower().strip("\n").split(" ").count("string")Count= my_string.lower().strip("\n").split(" ").count("strings")print("The number of occurance of word String is : ",Count)print("The number of occurance of word Strings is : ",Count)
Ein Downvote riskieren, weil 2+ andere diese Lösung bereits bereitgestellt haben. Ich habe sogar einen von ihnen positiv bewertet. Aber meine ist wahrscheinlich für Neulinge am einfachsten zu verstehen.
Für eine einfache Zeichenfolge mit Leerzeichenbegrenzung wäre die Verwendung von Dict recht schnell. Weitere Informationen finden Sie im folgenden Code
def getStringCount(mnstr:str, sbstr:str='')->int:""" Assumes two inputs string giving the string and
substring to look for number of occurances
Returns the number of occurances of a given string
"""
x = dict()
x[sbstr]=0
sbstr = sbstr.strip()for st in mnstr.split(' '):if st notin[sbstr]:continuetry:
x[st]+=1exceptKeyError:
x[st]=1return x[sbstr]
s ='foo bar foo test one two three foo bar'
getStringCount(s,'foo')
Die folgende Logik funktioniert für alle Zeichenfolgen und Sonderzeichen
def cnt_substr(inp_str, sub_str):
inp_join_str =''.join(inp_str.split())
sub_join_str =''.join(sub_str.split())return inp_join_str.count(sub_join_str)print(cnt_substr("the sky is $blue and not greenthe sky is $blue and not green","the sky"))
Während alle Antworten geschätzt werden, erklären Antworten nur mit Code das Thema in der Regel nicht sehr gut. Bitte fügen Sie einen Kontext hinzu.
creyD
0
#counting occurence of a substring in another string (overlapping/non overlapping)
s = input('enter the main string: ')# e.g.'bobazcbobobegbobobgbobobhaklpbobawanbobobobob'
p=input('enter the substring: ')# e.g.'bob'
counter=0
c=0for i in range(len(s)-len(p)+1):for j in range(len(p)):if s[i+j]==p[j]:if c<len(p):
c=c+1if c==len(p):
counter+=1
c=0breakcontinueelse:breakprint('number of occurences of the substring in the main string is: ',counter)
Bitte erwägen Sie, zumindest eine Erklärung hinzuzufügen, als ob dies die Frage beantworten würde
β.εηοιτ.βε
0
Hier ist eine Lösung, die sowohl für nicht überlappende als auch für überlappende Vorkommen funktioniert. Zur Verdeutlichung: Ein überlappender Teilstring ist einer, dessen letztes Zeichen mit seinem ersten Zeichen identisch ist.
def substr_count(st, sub):# If a non-overlapping substring then just# use the standard string `count` method# to count the substring occurencesif sub[0]!= sub[-1]:return st.count(sub)# Otherwise, create a copy of the source string,# and starting from the index of the first occurence# of the substring, adjust the source string to start# from subsequent occurences of the substring and keep# keep count of these occurences
_st = st[::]
start = _st.index(sub)
cnt =0while start isnotNone:
cnt +=1try:
_st = _st[start + len(sub)-1:]
start = _st.index(sub)except(ValueError,IndexError):return cnt
return cnt
Antworten:
string.count(substring)
, wie in:Aktualisieren:
Wie in den Kommentaren erwähnt, ist dies der Weg, um dies bei nicht überlappenden Ereignissen zu tun . Wenn Sie überlappende Vorkommen zählen müssen, überprüfen Sie die Antworten besser unter: " Python-Regex findet alle überlappenden Übereinstimmungen? " Oder überprüfen Sie einfach meine andere Antwort unten.
quelle
"GCAAAAAG".count("AAA")
gibt 1, während die richtige Antwort 3 ist?count
ist offensichtlich für nicht überlappende Spiele - was meistens das ist, was man tun möchte. stackoverflow.com/questions/5616822/… befasst sich mit überlappenden Übereinstimmungen - aber ein einfacher, wenn auch teurer Ausdruck lautet:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
string.count(substring1) + string.count(substring2)
. Beachten Sie jedoch, dass dies keine effiziente Methode ist, wenn viele Teilzeichenfolgen vorhanden sind, da für das Zählen der einzelnen Teilzeichenfolgen eine Iteration über die Hauptzeichenfolge erforderlich ist.''.join([substring1, substring2]).count(pattern)
ist effizienter als die oben vorgeschlagene Lösung. Ich habe mit timeit nachgesehen.quelle
Je nachdem, was Sie wirklich meinen, schlage ich folgende Lösungen vor:
Sie meinen eine Liste von durch Leerzeichen getrennten Unterzeichenfolgen und möchten wissen, wie die Positionsnummer der Unterzeichenfolge unter allen Unterzeichenfolgen lautet:
Sie meinen die Zeichenposition der Unterzeichenfolge in der Zeichenfolge:
Sie meinen die (nicht überlappende) zählt der Auftritt eines su-bstring:
quelle
s.find("su")
und fragst dich warum du bekommst0
? Nun, dies ist der erste Index der Unterzeichenfolge"su"
ins
. Versuchen Sie"ub"
und Sie werden bekommen1
, versuchen Sie zB"z"
und Sie werden-1
wie in keinem Teilstring gefunden.Der beste Weg, um überlappende Unterzeichenfolgen in einer bestimmten Zeichenfolge zu finden, besteht darin, den regulären Python-Ausdruck zu verwenden, der alle überlappenden Übereinstimmungen mithilfe der Bibliothek für reguläre Ausdrücke findet. Hier ist, wie es gemacht wird. Links ist der Teilstring und rechts geben Sie den passenden String an
quelle
Um überlappende Vorkommen eines Teilstrings in einer Zeichenfolge in Python 3 zu finden, führt dieser Algorithmus Folgendes aus:
Ich selbst habe diesen Algorithmus überprüft und er hat funktioniert.
quelle
Sie können die Häufigkeit auf zwei Arten zählen:
Verwenden des
count()
instr
:a.count(b)
Oder Sie können verwenden:
len(a.split(b))-1
Wo
a
ist der String undb
ist der Teilstring, dessen Häufigkeit berechnet werden soll.quelle
Die derzeit beste Antwort mit der Methode
count
zählt nicht wirklich für überlappende Vorkommen und kümmert sich auch nicht um leere Teilzeichenfolgen. Beispielsweise:Die erste Antwort sollte
2
nicht sein1
, wenn wir die überlappenden Teilzeichenfolgen betrachten. Für die zweite Antwort ist es besser, wenn eine leere Unterzeichenfolge 0 als Antwort zurückgibt.Der folgende Code kümmert sich um diese Dinge.
Jetzt, wenn wir es ausführen:
quelle
Szenario 1: Vorkommen eines Wortes in einem Satz. zB :
str1 = "This is an example and is easy"
. Das Auftreten des Wortes "ist". Lasst unsstr2 = "is"
Szenario 2: Auftreten eines Musters in einem Satz.
Vielen Dank!
quelle
Die Frage ist nicht sehr klar, aber ich werde antworten, was Sie an der Oberfläche fragen.
Eine Zeichenfolge S, die L Zeichen lang ist und bei der S [1] das erste Zeichen der Zeichenfolge und S [L] das letzte Zeichen ist, hat die folgenden Teilzeichenfolgen:
Es gibt also 0,5 * L * (L + 1) + 1 Teilzeichenfolgen in einer Zeichenfolge der Länge L. Rendern Sie diesen Ausdruck in Python, und Sie haben die Anzahl der Teilzeichenfolgen in der Zeichenfolge.
quelle
Eine Möglichkeit ist zu verwenden
re.subn
. Um beispielsweise die Anzahl der Vorkommen'hello'
in einer beliebigen Mischung von Fällen zu zählen, können Sie Folgendes tun:quelle
Ich werde meine akzeptierte Antwort als "einfache und offensichtliche Möglichkeit" beibehalten - dies gilt jedoch nicht für überlappende Ereignisse. Das herauszufinden kann naiv erfolgen, indem die Slices mehrfach überprüft werden - wie in: sum ("GCAAAAAGH" [i:]. Startwith ("AAA") für i in range (len ("GCAAAAAGH")))
(was 3 ergibt) - kann dies durch Trick mit regulären Ausdrücken erfolgen, wie bei Python Regex zu sehen ist, finden Sie alle überlappenden Übereinstimmungen? - und es kann auch zu feinem Code-Golfen führen - Dies ist meine "handgemachte" Zählung für überlappende Musterwährungen in einer Zeichenfolge, die versucht, nicht extrem naiv zu sein (zumindest werden bei jeder Interaktion keine neuen Zeichenfolgenobjekte erstellt):
quelle
Überlappende Vorkommen:
Ergebnisse:
quelle
Für überlappende Zählungen können wir verwenden:
Für nicht überlappende Fälle können wir die Funktion count () verwenden:
quelle
Wie wäre es mit einem Einzeiler mit Listenverständnis? Technisch gesehen sind die 93 Zeichen lang und ersparen mir PEP-8-Purismus. Die Antwort regex.findall ist am besten lesbar, wenn es sich um einen Code auf hoher Ebene handelt. Wenn Sie etwas Niedriges bauen und keine Abhängigkeiten wollen, ist dieses ziemlich schlank und gemein. Ich gebe die überlappende Antwort. Verwenden Sie natürlich nur count wie die Antwort mit der höchsten Punktzahl, wenn es keine Überlappung gibt.
quelle
Wenn Sie alle Teilzeichenfolgen (einschließlich überlappender Zeichenfolgen) zählen möchten, verwenden Sie diese Methode.
quelle
Wenn Sie die Anzahl der Teilzeichenfolgen in einer Zeichenfolge ermitteln möchten; Bitte verwenden Sie den folgenden Code. Der Code ist leicht zu verstehen, deshalb habe ich die Kommentare übersprungen. :) :)
quelle
Ich bin mir nicht sicher, ob dies bereits angeschaut wurde, aber ich dachte, dies sei eine Lösung für ein Wort, das "verfügbar" ist:
Wo Wort das Wort ist, nach dem Sie suchen, und Begriff der Begriff ist, nach dem Sie suchen
quelle
quelle
Hiermit wird ermittelt, wie oft eine Unterzeichenfolge in der Zeichenfolge gefunden wurde, und der Index wird angezeigt.
quelle
quelle
Ein Downvote riskieren, weil 2+ andere diese Lösung bereits bereitgestellt haben. Ich habe sogar einen von ihnen positiv bewertet. Aber meine ist wahrscheinlich für Neulinge am einfachsten zu verstehen.
quelle
Für eine einfache Zeichenfolge mit Leerzeichenbegrenzung wäre die Verwendung von Dict recht schnell. Weitere Informationen finden Sie im folgenden Code
quelle
Sie könnten die
startswith
Methode verwenden:quelle
Die folgende Logik funktioniert für alle Zeichenfolgen und Sonderzeichen
quelle
Hier ist die Lösung in Python 3, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird:
quelle
quelle
quelle
quelle
Dadurch wird eine Liste aller Vorkommen (auch überlappend) in der Zeichenfolge erstellt und gezählt
Beispiel:
erstellt diese Liste, speichert jedoch nur die BOLD- Werte:
[ab, bc , ca, ab, bc , cd]
das wird zurückkehren:
quelle
Hier ist eine Lösung, die sowohl für nicht überlappende als auch für überlappende Vorkommen funktioniert. Zur Verdeutlichung: Ein überlappender Teilstring ist einer, dessen letztes Zeichen mit seinem ersten Zeichen identisch ist.
quelle