2010-08-19 14 views
41

Estoy analizando cadenas que podrían contener cualquier cantidad de cadenas entrecomilladas (estoy analizando el código y tratando de evitar PLY). Quiero averiguar si se cita una subcadena y tengo el índice de subcadenas. Mi idea inicial fue utilizar re para encontrar todas las coincidencias y luego averiguar el rango de índices que representan.¿Encuentra los índices de todas las coincidencias de expresiones regulares en Python?

Parece que debería usar re con una expresión regular como \"[^\"]+\"|'[^']+' (estoy evitando lidiar con las comillas triples y tales por el momento). Cuando uso findall() obtengo una lista de las cadenas correspondientes, lo cual es bastante bueno, pero necesito índices.

Mi subcadena puede ser tan simple como c, y necesito averiguar si esta c particular está realmente cotizada o no.

Gracias de antemano.

+0

Parece que el trabajo no es adecuado para expresiones regulares. –

Respuesta

95

Esto es lo que quiere: (source)

re.finditer(pattern, string[, flags]) 

devuelven un iterador produciendo casos MatchObject sobre todas partidos que no se solapan para el patrón de RE en la cadena. La cadena es escaneada de izquierda a derecha, y las coincidencias se devuelven en el orden en que se encuentran. Las coincidencias vacías se incluyen en el resultado a menos que toquen el comienzo de otra coincidencia.

A continuación, puede obtener las posiciones de inicio y final de MatchObjects.

p. Ej.

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)] 
+0

¡Impresionante! Eso funciona bien Gracias. – xitrium

+24

Tenga en cuenta que puede usar 'm.span()' para obtener '(m.start(), m.end())' (y el argumento de grupo predeterminado es '0', por lo que puede omitirse). – Amber

+1

Brillante. Estaba buscando exactamente esto. – armandino

Cuestiones relacionadas