2010-04-26 15 views
11

Cuando usa variables (¿es esa la palabra correcta?) En expresiones regulares de python como esta: "blah (? P \ w +)" ("value" sería la variable), ¿cómo podría usted hace que el valor de la variable sea el texto después de "blah" hasta el final de la línea o hasta cierto personaje que no presta atención al contenido real de la variable. Por ejemplo, este es pseudo-código para lo que quiero:Expresiones regulares de Python asignando a grupos con nombre

>>> import re 
>>> p = re.compile("say (?P<value>continue_until_text_after_assignment_is_recognized) endsay") 
>>> m = p.match("say Hello hi yo endsay") 
>>> m.group('value') 
'Hello hi yo' 

Nota: El título probablemente no es comprensible. Eso es porque no sabía cómo decirlo. Lo siento si causé alguna confusión.

+0

He reparado un poco tu título, pero creo que fue claro por tu código de ejemplo lo que querías (al menos, espero haberlo interpretado bien). –

+0

FYI, las cosas entre paréntesis se llaman un "grupo". En su ejemplo, 'valor' es un nombre. Entonces, estás haciendo coincidir un "grupo nombrado". – Stephen

Respuesta

12

Para que te gustaría una expresión regular de

"say (?P<value>.+) endsay" 

El período coincide con cualquier carácter, y el signo más que indica que se debe repetir una o más veces ... así .+ significa cualquier secuencia de uno o más personajes Cuando coloque endsay al final, el motor de expresión regular se asegurará de que lo que corresponda de hecho termine con esa cadena.

+0

¡Funcionó a la perfección! Gracias. – None

10

Es necesario especificar lo que desea hacer coincidir si el texto es, por ejemplo,

say hello there and endsay but some more endsay 

Si desea hacer coincidir todo el hello there and endsay but some more subcadena, @ respuesta de David es correcta. De lo contrario, para que coincida con solo hello there and, el patrón tiene que ser:

say (?P<value>.+?) endsay 

con un signo de interrogación después de que el signo más para que sea no expansivo (por defecto es codiciosos, engullendo todo lo que sea posible al tiempo que permite una coincidencia general; no codicioso significa que engulle como poco como posible, de nuevo al tiempo que permite una coincidencia general).

+0

Pensé en eso, pero teniendo en cuenta la charla del OP acerca de la coincidencia hasta el final de la línea, parecía que un operador codicioso sería apropiado. Aún así, +1. –

Cuestiones relacionadas