Python possui string.find()
e string.rfind()
obtém o índice de uma substring em uma string.
Gostaria de saber se existe algo como o string.find_all()
que pode retornar todos os índices encontrados (não apenas o primeiro desde o início ou o primeiro a partir do final).
Por exemplo:
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')
retornar?'ttt'.rfind_all('tt')
, o que deve retornar '1'Respostas:
Não existe uma função de cadeia interna simples que faça o que você está procurando, mas você pode usar as expressões regulares mais poderosas :
Se você deseja encontrar correspondências sobrepostas, o lookahead fará isso:
Se você deseja encontrar tudo inversamente sem sobreposições, pode combinar um lookahead positivo e negativo em uma expressão como esta:
re.finditer
retorna um gerador , para que você possa alterar o[]
item acima para()
obter um gerador em vez de uma lista que será mais eficiente se você estiver apenas repetindo os resultados uma vez.fonte
[m.start() for m in re.finditer('test', 'test test test test')]
, como podemos procurartest
outext
? Torna-se muito mais complicado?Assim, nós podemos construí-lo:
Não são necessárias seqüências de caracteres ou expressões regulares temporárias.
fonte
start += len(sub)
porstart += 1
.re.findall
, eu recomendo adicionar emlen(sub) or 1
vez delen(sub)
, caso contrário, esse gerador nunca será encerrado em substring vazio.Aqui está uma maneira (muito ineficiente) de obter todas as correspondências (ou seja, sobrepostas):
fonte
Novamente, thread antigo, mas aqui está a minha solução usando um gerador e simples
str.find
.Exemplo
retorna
fonte
Você pode usar
re.finditer()
para correspondências sem sobreposição.mas não funcionará para:
fonte
Venha, vamos recuar juntos.
Não há necessidade de expressões regulares dessa maneira.
fonte
RecursionError
encontrará se houver muitas ocorrências suficientes. Outra são duas listas descartáveis que ele cria em cada iteração apenas para acrescentar um elemento, o que é muito abaixo do ideal para uma função de localização de string, que pode ser chamada várias vezes. Embora algumas vezes as funções recursivas pareçam elegantes e claras, elas devem ser tomadas com cautela.Se você está procurando apenas um personagem, isso funcionaria:
Além disso,
Meu palpite é que nenhum deles (especialmente o número 2) tem um desempenho terrível.
fonte
este é um tópico antigo, mas fiquei interessado e queria compartilhar minha solução.
Ele deve retornar uma lista de posições em que a substring foi encontrada. Comente se você encontrar um erro ou espaço para melhorias.
fonte
Isso faz o truque para mim usando o re.finditer
fonte
Este tópico é um pouco antigo, mas funcionou para mim:
fonte
Podes tentar :
fonte
Quaisquer que sejam as soluções fornecidas por outras pessoas, são completamente baseadas no método disponível find () ou em qualquer método disponível.
Chamando o método
fonte
Esta função não olha para todas as posições dentro da string, não desperdiça recursos de computação. Minha tentativa:
para usá-lo, chame assim:
fonte
Ao procurar uma grande quantidade de palavras-chave em um documento, use flashtext
O Flashtext roda mais rápido que o regex na grande lista de palavras de pesquisa.
fonte
fonte
Esta é a solução de uma pergunta semelhante do hackerrank. Espero que isso possa ajudá-lo.
Resultado:
fonte
Ao fatiar, encontramos todas as combinações possíveis e as anexamos a uma lista e encontramos o número de vezes que ocorre usando a
count
funçãofonte
s="test test test test"
ef="test"
suas impressões de código4
, mas OP esperado[0,5,10,15]
por favor, olhe o código abaixo
fonte
O caminho pitônico seria:
fonte
lambda
dessa maneira não é Pythonic e vai contra o PEP8 . 3) Esta não fornece a saída correta para a situação POVocê pode usar facilmente:
https://www.programiz.com/python-programming/methods/string/count
Felicidades!
fonte