Frage Python: Wie man überlappende Vorkommen eines Teilstrings zählt [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Ich wollte zählen, wie oft eine Zeichenkette wie 'aa' in 'aaa' (oder 'aaaa') erscheint.

Der offensichtlichste Code gibt die falsche (oder zumindest nicht intuitive) Antwort:

'aaa'.count('aa')
1 # should be 2
'aaaa'.count('aa')
2 # should be 3

Hat jemand eine einfache Möglichkeit, das zu beheben?


5
2017-10-10 17:38


Ursprung


Antworten:


Von str.count() Dokumentation:

Geben Sie die Anzahl von nicht überlappende Vorkommen der Teilzeichenfolge sub im Bereich [start, end]. Optionale Argumente Start und Ende werden als Slice-Notation interpretiert.

Also, nein. Sie erhalten das erwartete Ergebnis.

Wenn Sie die Anzahl der überlappenden Übereinstimmungen zählen möchten, verwenden Sie regex:

>>> import re
>>> 
>>> len(re.findall(r'(a)(?=\1)', 'aaa'))
2

Dies findet alle Vorkommen von a, die gefolgt wird von a. Die 2 a würde nicht erfasst, da wir Look-Ahead verwendet haben, was eine Assertion mit der Breite Null ist.


10
2017-10-10 17:39



haystack = "aaaa"
needle   = "aa"

matches  = sum(haystack[i:i+len(needle)] == needle 
               for i in xrange(len(haystack)-len(needle)+1))

# for Python 3 use range instead of xrange

6
2017-10-10 17:42



Sie müssen vorsichtig sein, weil Sie nach nicht überlappenden Teilsträngen zu suchen scheinen. Um das zu beheben, würde ich Folgendes tun:

len([s.start() for s in re.finditer('(?=aa)', 'aaa')])

Und wenn dir die Position, an der der Teilstring beginnt, egal ist, kannst du folgendes tun:

len([_ for s in re.finditer('(?=aa)', 'aaa')])

Obwohl jemand, der klüger ist als ich, zeigen könnte, dass es Leistungsunterschiede gibt :)


0
2017-10-10 17:44



Die Lösung berücksichtigt keine Überschneidungen.

Versuche dies:

big_string = "aaaa"
substring = "aaa"
count = 0 

for char in range(len(big_string)):
    count += big_string[char: char + len(subtring)] == substring

print count

0
2017-10-10 18:25