2010-04-20 9 views
23

Actualmente estoy usando expresiones regulares para buscar a través de feeds RSS para encontrar si se mencionan ciertas palabras y frases, y luego me gustaría extraer el texto en cualquier lado del partido también. Por ejemplo:Python: ¿ubica la posición de una coincidencia de expresiones regulares en una cadena?

String = "This is an example sentence, it is for demonstration only" 
re.search("is", String) 

Me gustaría saber la posición (s) de donde el 'es' se encuentran coincidencias para que pueda extraer y mostrar algo como esto:

1 match found: "This is an example sentence" 

que sé que sería fácil de hacer con splits, pero necesitaría saber cuál era el índice del primer personaje del partido en la cadena, que no sé cómo encontrar

+2

en realidad encontrarías "es" dos veces en tu ejemplo. – extraneon

Respuesta

38

Puedes usar .find("is"), it devolvería la posición de "es" en la cadena

o uso .start() vuelva

>>> re.search("is", String).start() 
2 

En realidad su partido "es" de "Th es"

Si tiene que coincidir por palabra, se debe utilizar antes y después de \b "es", \b es el límite de la palabra.

>>> re.search(r"\bis\b", String).start() 
5 
>>> 

para obtener más información acerca de las expresiones regulares de Python, docs aquí

+0

No tengo idea de cómo me perdí esto en la documentación, hace exactamente lo que necesitaba, ¡gracias! –

+0

Si quiere capturar solo la palabra "es", creo que 're.search (" es ", String) .start()' también debería decir ... por supuesto que hay otros ejemplos también. – kuskmen

+0

Tenga cuidado con el hecho de que re.search devuelve None si no coincide. – rstackhouse

19

No creo que esta pregunta ha sido contestada por completo todavía, porque todos las respuestas solo dan ejemplos de coincidencias únicas. La pregunta de OP demuestra los matices de tener 2 coincidencias, así como una coincidencia de subcadena que no se debe informar porque no es una palabra/token.

para que coincida con múltiples ocurrencias, se podría hacer algo como esto:

iter = re.finditer(r"\bis\b", String) 
indices = [m.start(0) for m in iter] 

Esto se obtendrá una lista de los dos índices de la cadena original.

Cuestiones relacionadas