Python a string.find()
et string.rfind()
pour obtenir l'index d'une sous-chaîne dans une chaîne.
Je me demande s'il y a quelque chose comme string.find_all()
qui peut retourner tous les index trouvés (pas seulement le premier depuis le début ou le premier depuis la fin).
Par exemple:
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')
revenir?'ttt'.rfind_all('tt')
, qui devrait renvoyer '1'Réponses:
Il n'y a pas de fonction de chaîne intégrée simple qui fait ce que vous cherchez, mais vous pouvez utiliser les expressions régulières les plus puissantes :
Si vous voulez trouver des correspondances qui se chevauchent, lookahead le fera:
Si vous voulez une recherche inversée sans chevauchements, vous pouvez combiner l'anticipation positive et négative en une expression comme celle-ci:
re.finditer
renvoie un générateur , vous pouvez donc changer le[]
dans ce qui précède pour()
obtenir un générateur au lieu d'une liste qui sera plus efficace si vous parcourez les résultats une seule fois.la source
[m.start() for m in re.finditer('test', 'test test test test')]
, comment pouvons-nous recherchertest
outext
? Cela devient-il beaucoup plus compliqué?Ainsi, nous pouvons le construire nous-mêmes:
Aucune chaîne ou expression régulière temporaire n'est requise.
la source
start += len(sub)
parstart += 1
.re.findall
, je recommande d'ajouterlen(sub) or 1
au lieu delen(sub)
, sinon ce générateur ne se terminera jamais sur une sous-chaîne vide.Voici un moyen (très inefficace) d'obtenir toutes les correspondances (c'est-à-dire même les chevauchements):
la source
Encore une fois, vieux fil, mais voici ma solution en utilisant un générateur et simple
str.find
.Exemple
Retour
la source
Vous pouvez utiliser
re.finditer()
pour des correspondances qui ne se chevauchent pas.mais ne fonctionnera pas pour:
la source
Venez, laissez-nous récurer ensemble.
Pas besoin d'expressions régulières de cette façon.
la source
RecursionError
s'il y a suffisamment d'occurrences. Un autre est deux listes à jeter qu'il crée à chaque itération juste pour ajouter un élément, ce qui est très sous-optimal pour une fonction de recherche de chaîne, qui pourrait éventuellement être appelée beaucoup de fois. Bien que les fonctions récursives semblent parfois élégantes et claires, elles doivent être prises avec prudence.Si vous cherchez juste un seul personnage, cela fonctionnerait:
Aussi,
Mon intuition est qu'aucune de celles-ci (en particulier # 2) n'est terriblement performante.
la source
c'est un vieux fil mais je me suis intéressé et je voulais partager ma solution.
Il devrait renvoyer une liste de positions où la sous-chaîne a été trouvée. Veuillez commenter si vous voyez une erreur ou une marge d'amélioration.
la source
Cela fait l'affaire pour moi en utilisant re.finditer
la source
Ce fil est un peu vieux mais cela a fonctionné pour moi:
la source
Tu peux essayer :
la source
Quelles que soient les solutions fournies par d'autres, elles sont entièrement basées sur la méthode disponible find () ou sur toute méthode disponible.
Appel de la méthode
la source
Cette fonction ne regarde pas toutes les positions à l'intérieur de la chaîne, elle ne gaspille pas les ressources de calcul. Mon essai:
pour l'utiliser, appelez-le comme ceci:
la source
Lorsque vous recherchez une grande quantité de mots clés dans un document, utilisez le flashtext
Flashtext s'exécute plus rapidement que regex sur une grande liste de mots de recherche.
la source
la source
C'est la solution d'une question similaire de hackerrank. J'espère que cela pourrait vous aider.
Production:
la source
En découpant, nous trouvons toutes les combinaisons possibles et les ajoutons dans une liste et trouvons le nombre de fois où cela se produit en utilisant la
count
fonctionla source
s="test test test test"
etf="test"
votre code s'imprime4
, mais OP attendu[0,5,10,15]
veuillez regarder ci-dessous le code
la source
La voie pythonique serait:
la source
lambda
cette manière n'est pas Pythonic et va à l'encontre de PEP8 . 3) Cela ne fournit pas la sortie correcte pour la situation des POVous pouvez facilement utiliser:
https://www.programiz.com/python-programming/methods/string/count
À votre santé!
la source