Python tiene string.find()
ystring.rfind()
para obtener el índice de una subcadena en una cadena.
Me pregunto si hay algo como lo string.find_all()
que puede devolver todos los índices encontrados (no solo el primero desde el principio o el primero desde el final).
Por ejemplo:
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')
volver?'ttt'.rfind_all('tt')
, que debería devolver '1'Respuestas:
No existe una función de cadena integrada simple que haga lo que está buscando, pero podría usar las expresiones regulares más potentes :
Si desea encontrar coincidencias superpuestas, lookahead lo hará:
Si desea una búsqueda inversa sin superposiciones, puede combinar anticipación positiva y negativa en una expresión como esta:
re.finditer
devuelve un generador , por lo que podría cambiar lo[]
anterior para()
obtener un generador en lugar de una lista que será más eficiente si solo está iterando a través de los resultados una vez.fuente
[m.start() for m in re.finditer('test', 'test test test test')]
, ¿cómo podemos buscartest
otext
? ¿Se vuelve mucho más complicado?Por lo tanto, podemos construirlo nosotros mismos:
No se requieren cadenas temporales o expresiones regulares.
fuente
start += len(sub)
constart += 1
.re.findall
, recomendaría agregar enlen(sub) or 1
lugar delen(sub)
, de lo contrario, este generador nunca terminará en una subcadena vacía.Aquí hay una forma (muy ineficiente) de obtener todas las coincidencias (es decir, incluso superpuestas):
fuente
Una vez más, viejo hilo, pero aquí está mi solución usando un generador y simple
str.find
.Ejemplo
devoluciones
fuente
Puede usar
re.finditer()
para coincidencias no superpuestas.pero no funcionará para:
fuente
Ven, volvamos juntos.
No hay necesidad de expresiones regulares de esta manera.
fuente
RecursionError
si hay muchos eventos suficientes. Otra son dos listas de descarte que crea en cada iteración solo por agregar un elemento, que es muy subóptimo para una función de búsqueda de cadenas, que posiblemente podría llamarse muchas veces. Aunque a veces las funciones recursivas parecen elegantes y claras, deben tomarse con precaución.Si solo está buscando un solo personaje, esto funcionaría:
También,
Mi presentimiento es que ninguno de estos (especialmente # 2) es terriblemente eficaz.
fuente
Este es un hilo viejo pero me interesé y quería compartir mi solución.
Debería devolver una lista de posiciones donde se encontró la subcadena. Comente si ve un error o un margen de mejora.
fuente
Esto hace el truco para mí usando re.finditer
fuente
Este hilo es un poco viejo pero esto funcionó para mí:
fuente
Puedes probar :
fuente
Cualesquiera que sean las soluciones proporcionadas por otros, se basan completamente en el método disponible find () o en cualquier método disponible.
Llamando al método
fuente
Esta función no mira todas las posiciones dentro de la cadena, no desperdicia recursos de cómputo. Mi intento:
para usarlo llámalo así:
fuente
Cuando busque una gran cantidad de palabras clave en un documento, use flashtext
Flashtext se ejecuta más rápido que regex en una gran lista de palabras de búsqueda.
fuente
fuente
Esta es la solución de una pregunta similar de hackerrank. Espero que esto te pueda ayudar.
Salida:
fuente
Al dividir, encontramos todas las combinaciones posibles y las agregamos en una lista y encontramos el número de veces que ocurre usando la
count
funciónfuente
s="test test test test"
yf="test"
su código se imprime4
, pero OP esperado[0,5,10,15]
mira el siguiente código
fuente
La forma pitónica sería:
fuente
lambda
esta manera no es Pythonic y va en contra de PEP8 . 3) Esto no proporciona la salida correcta para la situación de los OPPuedes usar fácilmente:
https://www.programiz.com/python-programming/methods/string/count
¡Salud!
fuente