Python hat string.find()
und string.rfind()
um den Index eines Teilstrings in einem String zu erhalten.
Ich frage mich, ob es so etwas gibt, string.find_all()
das alle gefundenen Indizes zurückgeben kann (nicht nur den ersten vom Anfang oder den ersten vom Ende).
Zum Beispiel:
string = "test test test test"
print string.find('test') # 0
print string.rfind('test') # 15
#this is the goal
print string.find_all('test') # [0,5,10,15]
'ttt'.find_all('tt')
zurückkehren?'ttt'.rfind_all('tt')
, die '1' zurückgeben solltenAntworten:
Es gibt keine einfache integrierte Zeichenfolgenfunktion, die das tut, wonach Sie suchen, aber Sie könnten die leistungsstärkeren regulären Ausdrücke verwenden :
Wenn Sie überlappende Übereinstimmungen suchen möchten, führt Lookahead Folgendes aus :
Wenn Sie eine umgekehrte Suche ohne Überlappungen wünschen, können Sie positive und negative Lookahead zu einem Ausdruck wie diesem kombinieren:
re.finditer
Gibt einen Generator zurück , sodass Sie[]
die obigen Angaben ändern können()
, um einen Generator anstelle einer Liste zu erhalten, die effizienter ist, wenn Sie die Ergebnisse nur einmal durchlaufen.quelle
[m.start() for m in re.finditer('test', 'test test test test')]
wie können wir danach suchentest
odertext
? Wird es viel komplizierter?So können wir es selbst bauen:
Keine temporären Zeichenfolgen oder regulären Ausdrücke erforderlich.
quelle
start += len(sub)
mitstart += 1
.re.findall
, würde ich empfehlen,len(sub) or 1
anstelle von hinzuzufügenlen(sub)
, da dieser Generator sonst niemals bei leerem Teilstring endet.Hier ist ein (sehr ineffizienter) Weg, um alle (dh sogar überlappenden) Übereinstimmungen zu erhalten:
quelle
Wieder alter Thread, aber hier ist meine Lösung mit einem Generator und Plain
str.find
.Beispiel
kehrt zurück
quelle
Sie können
re.finditer()
für nicht überlappende Übereinstimmungen verwenden.funktioniert aber nicht für:
quelle
Komm, lass uns zusammen zurückkehren.
Auf diese Weise sind keine regulären Ausdrücke erforderlich.
quelle
RecursionError
wenn es genügend Vorkommen gibt. Eine andere sind zwei Wegwerflisten, die bei jeder Iteration erstellt werden, nur um ein Element anzuhängen, was für eine Zeichenfolgenfindungsfunktion, die möglicherweise häufig aufgerufen werden kann, sehr suboptimal ist. Obwohl rekursive Funktionen manchmal elegant und klar erscheinen, sollten sie mit Vorsicht betrachtet werden.Wenn Sie nur nach einem einzelnen Charakter suchen, würde dies funktionieren:
Ebenfalls,
Meine Vermutung ist, dass keines von diesen (besonders # 2) schrecklich performant ist.
quelle
Dies ist ein alter Thread, aber ich wurde interessiert und wollte meine Lösung teilen.
Es sollte eine Liste der Positionen zurückgeben, an denen der Teilstring gefunden wurde. Bitte kommentieren Sie, wenn Sie einen Fehler oder Verbesserungsbedarf sehen.
quelle
Dies macht den Trick für mich mit re.finditer
quelle
Dieser Thread ist etwas alt, aber das hat bei mir funktioniert:
quelle
Du kannst es versuchen :
quelle
Unabhängig davon, welche Lösungen von anderen bereitgestellt werden, basieren sie vollständig auf der verfügbaren Methode find () oder verfügbaren Methoden.
Methode aufrufen
quelle
Diese Funktion betrachtet nicht alle Positionen innerhalb der Zeichenfolge und verschwendet keine Rechenressourcen. Mein Versuch:
um es zu benutzen, nenne es so:
quelle
Verwenden Sie Flashtext, wenn Sie nach einer großen Anzahl von Schlüsselwörtern in einem Dokument suchen
Flashtext wird in einer großen Liste von Suchwörtern schneller ausgeführt als Regex.
quelle
quelle
Dies ist die Lösung einer ähnlichen Frage von Hackerrank. Ich hoffe das könnte dir helfen.
Ausgabe:
quelle
Durch Schneiden finden wir alle möglichen Kombinationen und fügen sie in eine Liste ein und ermitteln, wie oft sie mit der
count
Funktion auftretenquelle
s="test test test test"
undf="test"
Ihr Code wird gedruckt4
, aber OP erwartet[0,5,10,15]
Bitte schauen Sie sich den folgenden Code an
quelle
Der pythonische Weg wäre:
quelle
lambda
dieses Weges ist nicht pythonisch und widerspricht PEP8 . 3) Dies liefert nicht die richtige Ausgabe für die OP-SituationSie können leicht verwenden:
https://www.programiz.com/python-programming/methods/string/count
Prost!
quelle