[Python-es] Regex cadena multilinea

Jhonatan Sneider Salguero Villa sney2002 en gmail.com
Mie Mayo 20 17:31:14 EDT 2020


No es exactamente lo que estas buscando pero puede que te sirva.

según entiendo quieres sacar todo el texto que este entre:
== {{codigo+id\d}} ==
y la siguiente linea que empiece con ==

usando (?<...) y (?=...) lookbehind y lookahead para asegurarse que el
texto este entre estos dos "tokens"
pero que no se incluyan en el resultado.

con este regex encuentras todos los textos que coincidan con este criterio.
luego solo usas el primero que  debe ser el que buscas.

import re

rfind = re.compile(r'''
    (?<==\s{{codigo\+id\d}}\s==\n) # El {{codigo}} arriba del texto que
quieres
    .*?                            # El texto que quieres
    (?=\n==\s|$) # La siguiente linea que comienza con == o el fin de la
linea
    ''', re.DOTALL | re.VERBOSE)

rfind.findall(opcion1)[0]
rfind.findall(opcion2)[0]
rfind.findall(opcion3)[0]

Espero te sirva.

Jhonatan.

El mié., 20 may. 2020 a las 12:49, kikocorreoso vía Python-es (<
python-es en python.org>) escribió:

>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Wednesday, May 20, 2020 6:10 PM, AGTUGO <agtugo en gmail.com> wrote:
>
> No entendí el problema, podrías explicarmelo otra vez?
>
>
> La verdad es que quizá no me he explicado bien :-P
>
> Empiezo de nuevo.
>
> El problema. Imaginad que tengo una cadena que es algo así:
> opcion1 = """
> esto es parte de
> un texto que no me interesa lo más mínimo.
> == {{codigo+id1}} ==
> *Esta sería la parte que me interesa *
> *=== {{puede tener cosas así}} ===*
> *pero ninguna línea de este texto empieza con doble signo de igual==*
> == {{codigo+id2}} ==
> En la anterior línea debería de haber dejado de extraer mi patrón puesto
> que empieza con doble línea y es lo que limita lo que busco
> === {{loquesea}} ===
> esto sigue sin interesarme
> == {{codigo+id3}} ==
> esto tampoco me interesa
> === {{loquesea}} ===
> y esto tampoco"""
>
> Otra opción es que sea:
> opcion2 = """
> esto es parte de
> un texto que no me interesa lo más mínimo.
> == {{codigo+id1}} ==
> *Esta sería la parte que me interesa*
> *=== {{puede tener cosas así}} ===*
> *pero ninguna línea de este texto empieza con doble signo de igual==*
> == lo que sea ==
> En la anterior línea debería de haber dejado de extraer mi patrón puesto
> que empieza con doble línea y es lo que limita lo que busco
> === {{loquesea}} ===
> esto sigue sin interesarme"""
>
> Otra opción es que sea:
> opcion3 = """
> esto es parte de
> un texto que no me interesa lo más mínimo.
> == {{codigo+id1}} ==
> *Esta sería la parte que me interesa *
> *=== {{puede tener cosas así}} ===*
> *pero ninguna línea de este texto empieza con doble signo de igual==*"""
>
> Es decir, quiero extraer esto:
> *Esta sería la parte que me interesa*
> *=== {{puede tener cosas así}} ===*
> *pero ninguna línea de este texto empieza con doble signo de igual==*
>
> coger todo lo que haya entre "== {{codigo+id1}} ==" y una de las tres
> posibilidades que son:
>
>    - "== {{codigo+id*n*}} ==" el siguiente código idn que no sea id1.
>    - "== otras cosas ==" (estas otras cosas siempre empiezan con signo
>    '=' repetido dos veces, pero no más, al principio de línea).
>    - "fin de la cadena", es decir, que no encuentra ni lo primero ni lo
>    segundo y llega al final.
>
> Lo anterior se puede reducir a dos posibilidades. Quiero extraer todo lo
> que esté entre "== {{codigo+id1}} =="  y:
>
>    - La primera línea que empiece por "== " (inicio de línea y solo dos
>    símbolos de igual (no tres o más)).
>
> o
>
>    - El final de la cadena.
>
> No sé si ahora se entiende mejor.
>
> Si además de darme un patrón me lo explicáis un poco os lo agradezco.
>
> Gracias.
>
> Saludos.
>
> On Wed, May 20, 2020, 9:06 AM kikocorreoso vía Python-es <
> python-es en python.org> wrote:
>
>> Buenas a todos.
>>
>> A ver si alguien me puede echar un cable porque llevo varios días dándome
>> cabezazos y no soy capaz de sacarlo y mi regex-fu no llega más allá y sé
>> que aquí hay auténticos maestros.
>>
>> El problema. Imaginad que tengo una cadena que es:
>> opcion1 = """
>> f safsj ofsa
>>  sadjfoisajd
>> == {{codigo+id1}} ==
>> *jfpoj *
>> *=== {{loquesea}} ===*
>> *eij peoijgipwg*
>> == {{codigo+id2}} ==
>> jfpoj
>> === {{loquesea}} ===
>> eij peoijgipwg
>> == {{codigo+id3}} ==
>> jfpoj
>> === {{loquesea}} ===
>> eij peoijgipwg"""
>>
>> Otra opción es que sea:
>> opcion2 = """
>> f safsj ofsa
>>  sadjfoisajd
>> == {{codigo+id1}} ==
>> *jfpoj *
>> *=== {{loquesea}} ===*
>> *eij peoijgipwg*
>> == otras cosas ==
>> gjopeij
>> ep ep o"""
>>
>> Otra opción es que sea:
>> opcion3 = """
>> f safsj ofsa
>>  sadjfoisajd
>> == {{codigo+id1}} ==
>> *jfpoj*
>> *=== {{loquesea}} ===*
>> *eij peoijgipwg*"""
>>
>> Es decir, quiero coger todo lo que haya entre "== {{codigo+id1}} ==" y
>> una de las tres posibilidades que son:
>>
>>    - "== {{codigo+id*n*}} ==" el siguiente código idn que no sea id1.
>>    - "== otras cosas ==" (estas otras cosas siempre empiezan con signo
>>    '=' repetido dos veces, pero no más, al principio de línea).
>>    - "fin de la cadena", es decir, que no encuentra ni lo primero ni lo
>>    segundo y llega al final.
>>
>> Si además de darme un patrón me lo explicáis un poco os lo agradezco.
>>
>> Muchas gracias.
>>
>> Saludos.
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20200520/9b1ae8db/attachment.html>


Más información sobre la lista de distribución Python-es