Python ma string.find()
i string.rfind()
pobiera indeks podłańcucha w ciągu.
Zastanawiam się, czy istnieje coś takiego, string.find_all()
co może zwrócić wszystkie znalezione indeksy (nie tylko pierwszy od początku, czy pierwszy od końca).
Na przykład:
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')
zwrócić'ttt'.rfind_all('tt')
, co powinno zwrócić „1”Odpowiedzi:
Nie ma prostej wbudowanej funkcji łańcucha, która robi to, czego szukasz, ale możesz użyć bardziej wydajnych wyrażeń regularnych :
Jeśli chcesz znaleźć nakładające się mecze, lookahead zrobi to:
Jeśli chcesz znaleźć wszystko wstecz bez nakładania się, możesz połączyć pozytywne i negatywne spojrzenie w przyszłość w takie wyrażenie:
re.finditer
zwraca generator , więc możesz zmienić[]
powyższe, aby()
uzyskać generator zamiast listy, co będzie bardziej wydajne, jeśli będziesz powtarzał wyniki tylko raz.źródło
[m.start() for m in re.finditer('test', 'test test test test')]
, jak możemy szukaćtest
lubtext
? Czy staje się to znacznie bardziej skomplikowane?W ten sposób możemy zbudować go sami:
Nie są wymagane tymczasowe łańcuchy ani wyrażenia regularne.
źródło
start += len(sub)
zstart += 1
.re.findall
, polecam dodanielen(sub) or 1
zamiastlen(sub)
, w przeciwnym razie ten generator nigdy nie zakończy działania na pustym podciągu.Oto (bardzo nieefektywny) sposób uzyskania wszystkich (tzn. Nawet nakładających się) dopasowań:
źródło
Znowu stary wątek, ale oto moje rozwiązanie z wykorzystaniem generatora i zwykłego
str.find
.Przykład
zwroty
źródło
Możesz użyć
re.finditer()
do nie nakładających się meczów.ale nie będzie działać dla:
źródło
Chodź, połączmy się ponownie.
W ten sposób nie potrzeba wyrażeń regularnych.
źródło
RecursionError
nie, jeśli wystąpi wystarczająco dużo zdarzeń. Kolejną są dwie listy „wyrzucanych”, które tworzy na każdej iteracji tylko w celu dodania jednego elementu, co jest bardzo nieoptymalne dla funkcji wyszukiwania ciągów, które prawdopodobnie można nazwać wiele razy. Chociaż czasem funkcje rekurencyjne wydają się eleganckie i przejrzyste, należy o nie podchodzić ostrożnie.Jeśli szukasz tylko jednej postaci, to zadziała:
Również,
Mam przeczucie, że żadne z nich (szczególnie # 2) nie jest strasznie wydajne.
źródło
to jest stary wątek, ale zainteresowałem się i chciałem podzielić się moim rozwiązaniem.
Powinien zwrócić listę pozycji, w których znaleziono podciąg. Skomentuj, jeśli zobaczysz błąd lub miejsce na ulepszenie.
źródło
To załatwia sprawę za pomocą re.finditer
źródło
Ten wątek jest trochę stary, ale działał dla mnie:
źródło
Możesz spróbować :
źródło
Niezależnie od rozwiązań dostarczonych przez innych, są one całkowicie oparte na dostępnej metodzie find () lub dowolnych dostępnych metodach.
Wywołanie metody
źródło
Ta funkcja nie patrzy na wszystkie pozycje w ciągu, nie marnuje zasobów obliczeniowych. Moja próba:
aby go użyć, nazwij to tak:
źródło
Szukając dużej liczby słów kluczowych w dokumencie, użyj tekstu błyskawicznego
Flashtext działa szybciej niż wyrażenie regularne na dużej liście wyszukiwanych słów.
źródło
źródło
To jest rozwiązanie podobnego pytania od hackera. Mam nadzieję, że to może ci pomóc.
Wynik:
źródło
Krojąc, znajdujemy wszystkie możliwe kombinacje i dołączamy je do listy oraz określamy, ile razy występuje przy użyciu
count
funkcjiźródło
s="test test test test"
if="test"
kod zostanie wydrukowany4
, ale oczekiwany OP[0,5,10,15]
spójrz na poniższy kod
źródło
Pythonicznym sposobem byłoby:
źródło
lambda
ten sposób nie jest Pythonic i jest sprzeczne z PEP8 . 3) Nie zapewnia to prawidłowego wyniku dla sytuacji POMożesz łatwo użyć:
https://www.programiz.com/python-programming/methods/string/count
Twoje zdrowie!
źródło