¿Cómo buscar la última aparición de una expresión regular en una cadena en python?

En Python, puedo buscar fácilmente la primera aparición de una expresión regular dentro de una cadena como esta:

import re re.search("pattern", "target_text") 

Ahora necesito encontrar la última aparición de la expresión regular en una cadena, esto no parece ser compatible con re modulo.

Puedo revertir la cadena para “buscar la primera aparición”, pero también necesito revertir la expresión regular, que es un problema mucho más difícil.

También puedo iterar para encontrar todas las ocurrencias de izquierda a derecha, y simplemente guardar la última, pero eso parece incómodo.

¿Hay una manera inteligente de encontrar el caso más a la derecha?

Un enfoque es prefijar la expresión regular con (?s:.*) Y forzar el motor para intentar hacer coincidir en la posición más alejada y retroceder gradualmente:

 re.search("(?s:.*)pattern", "target_text") 

Tenga en cuenta que el resultado de este método puede diferir de re.findall("pattern", "target_text")[-1] , ya que el método findall busca coincidencias no superpuestas , y no se incluyen todas las subcadenas que pueden combinarse en el resultado.

Por ejemplo, al ejecutar la expresión regular aa en abaca , findall devolvería aba como la única coincidencia y la seleccionaría como la última coincidencia, mientras que el código anterior devolverá aca como la coincidencia.


Otra alternativa más es utilizar el paquete regex , que admite el modo de coincidencia REVERSE .

El resultado sería más o menos el mismo que el método con (?s:.*) En el paquete de re como se describe anteriormente. Sin embargo, dado que no he probado el paquete por mi cuenta, no está claro cómo funciona la referencia inversa en el modo REVERSE : el patrón puede requerir modificaciones en tales casos.

 import re re.search("pattern(?!.*pattern)", "target_text") 

o

 import re re.findall("pattern", "target_text")[-1] 

Puede utilizar estos 2 enfoques.

Si quieres positions usa

 x="abc abc abc" print [(i.start(),i.end(),i.group()) for i in re.finditer(r"abc",x)][-1]