Estoy tratando de encontrar cada serie de números de 10 dígitos dentro de una serie más grande de números usando re en Python 2.6.
Puedo obtener fácilmente coincidencias no superpuestas, pero quiero todas las coincidencias en la serie de números. P.ej.
en "123456789123456789"
Debería obtener la siguiente lista:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Encontré referencias a una "búsqueda anticipada", pero los ejemplos que he visto solo muestran pares de números en lugar de agrupaciones más grandes y no he podido convertirlos más allá de los dos dígitos.
python
regex
overlapping
danspants
fuente
fuente
(a|ab|abc)
generalmente se pueden reescribir como no superpuestas con grupos de captura anidados, por ejemplo(a(b(c)?)?)?
, donde ignoramos todos menos el grupo de captura más externo (es decir, el más a la izquierda) al desempaquetar una coincidencia; es cierto que esto es un poco doloroso y menos legible. Esta también será una expresión regular más eficaz para coincidir.Respuestas:
Utilice un grupo de captura dentro de una anticipación. La búsqueda anticipada captura el texto que le interesa, pero la coincidencia real es técnicamente la subcadena de ancho cero antes de la anticipación, por lo que técnicamente las coincidencias no se superponen:
fuente
También puede intentar usar el módulo de terceros
regex
(nore
), que admite coincidencias superpuestas.fuente
Me gustan las expresiones regulares, pero no son necesarias aquí.
Simplemente
resultado
fuente
0 <= i < len(s)-n+1
está garantizada como el comienzo de una coincidencia de 10 dígitos. También me imagino que su código podría acelerarse, sería interesante codificar golf por velocidad.