586 Stimmen

Wie findet man alle Vorkommen einer Teilzeichenkette?

Python hat string.find() y string.rfind() um den Index einer Teilzeichenkette in einer Zeichenkette zu ermitteln.

Ich frage mich, ob es so etwas gibt wie string.find_all() die 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]

20 Stimmen

Was sollte 'ttt'.find_all('tt') zurückkehren?

4 Stimmen

Sollte er '0' zurückgeben. Natürlich muss es in einer perfekten Welt auch eine 'ttt'.rfind_all('tt') was '1' ergeben sollte.

5 Stimmen

Reine Anfragen zum Schreiben von Code sind auf Stack Overflow tabu - wir erwarten, dass sich die Fragen hier auf spezifisch Programmierprobleme - aber wir helfen Ihnen gerne, sie selbst zu schreiben! Sagen Sie es uns was Sie ausprobiert haben und wo Sie feststecken. Dies wird uns auch helfen, Ihre Frage besser zu beantworten.

25voto

Chinmay Kanchi Punkte 58341

Sie können verwenden re.finditer() für sich nicht überschneidende Treffer.

>>> import re
>>> aString = 'this is a string where the substring "is" is repeated several times'
>>> print [(a.start(), a.end()) for a in list(re.finditer('is', aString))]
[(2, 4), (5, 7), (38, 40), (42, 44)]

sondern wird nicht arbeiten für:

In [1]: aString="ababa"

In [2]: print [(a.start(), a.end()) for a in list(re.finditer('aba', aString))]
Output: [(0, 3)]

22voto

Cody Piersall Punkte 7794

Komm, lass uns gemeinsam nachdenken.

def locations_of_substring(string, substring):
    """Return a list of locations of a substring."""

    substring_length = len(substring)    
    def recurse(locations_found, start):
        location = string.find(substring, start)
        if location != -1:
            return recurse(locations_found + [location], location+substring_length)
        else:
            return locations_found

    return recurse([], 0)

print(locations_of_substring('this is a test for finding this and this', 'this'))
# prints [0, 27, 36]

Auf diese Weise sind keine regulären Ausdrücke erforderlich.

13voto

jstaab Punkte 2763

Wenn Sie nur ein einzelnes Zeichen suchen, würde dies funktionieren:

string = "dooobiedoobiedoobie"
match = 'o'
reduce(lambda count, char: count + 1 if char == match else count, string, 0)
# produces 7

Auch,

string = "test test test test"
match = "test"
len(string.split(match)) - 1
# produces 4

Meine Vermutung ist, dass keine von beiden (insbesondere Nr. 2) besonders leistungsfähig ist.

12voto

Thurines Punkte 101

Dies ist ein altes Thema, aber ich habe mich dafür interessiert und wollte meine Lösung mitteilen.

def find_all(a_string, sub):
    result = []
    k = 0
    while k < len(a_string):
        k = a_string.find(sub, k)
        if k == -1:
            return result
        else:
            result.append(k)
            k += 1 #change to k += len(sub) to not search overlapping results
    return result

Sie sollte eine Liste der Positionen zurückgeben, an denen die Teilzeichenkette gefunden wurde. Bitte kommentieren Sie, wenn Sie einen Fehler oder Raum für Verbesserungen sehen.

9voto

Bruno Vermeulen Punkte 2617

So funktioniert es bei mir mit re.finditer

import re

text = 'This is sample text to test if this pythonic '\
       'program can serve as an indexing platform for '\
       'finding words in a paragraph. It can give '\
       'values as to where the word is located with the '\
       'different examples as stated'

#  find all occurances of the word 'as' in the above text

find_the_word = re.finditer('as', text)

for match in find_the_word:
    print('start {}, end {}, search string \'{}\''.
          format(match.start(), match.end(), match.group()))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X