Foros del Web » Programación para mayores de 30 ;) » RegExp »

[SOLUCIONADO] Expresión regular que se quede con frases

Estas en el tema de Expresión regular que se quede con frases en el foro de RegExp en Foros del Web. Buenos días, estoy desarrollando un pequeño programilla en python y no consigo encontrar la expresión regular adecuada. Tengo la siguiente cadena de caracteres: Código: ' ...
  #1 (permalink)  
Antiguo 25/01/2014, 06:01
 
Fecha de Ingreso: octubre-2009
Mensajes: 29
Antigüedad: 15 años
Puntos: 4
Expresión regular que se quede con frases

Buenos días, estoy desarrollando un pequeño programilla en python y no consigo encontrar la expresión regular adecuada.

Tengo la siguiente cadena de caracteres:
Código:
'    Tipo de red         : Infraestructura'
Con el siguiente código:

Código:
foo = re.findall(r'(\w+(\s\w+)+)\s+:\s+(\w+)', '    Tipo de red         : Infraestructura')
print(foo)
consigo el siguiente resultado:

Código:
[('Tipo de red', ' red', 'Infraestructura')]
Y en realidad lo que me gustaría obtener es:
Código:
[('Tipo de red', 'Infraestructura')]
Sé que lo podría resolver con un split por los dos puntos y haciendo un trim para quitar los espacios sobrantes, pero me parece más elegante con la expresión regular.

¿Alguna idea de cómo solucionarlo?

Muchísimas gracias
  #2 (permalink)  
Antiguo 25/01/2014, 21:12
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Expresión regular que se quede con frases

El hecho es que tienes sub-capturas innecesarias, además de que la expresión es algo ambigua (y fea ).

Si lo único que separa ambos valores son los dos puntos entonces puedes simplificar la expresión sin dar tantas vueltas:

Cita:
[^:]+
Eso significa "cualquier cosa que no sea dos puntos", y bien, con eso capturaríamos los valores sin rodeos, pero sigue faltando omitir los espacios extra, ¿cierto?

Cita:
\s*
Bingo!

Eso, eliminará todo espacio de sobra.

Ahora basta con construir la expresión:
Cita:
\s*([^:]+?)\s*:\s*([^:]+)\s*
Dicha RegExp tratará de evitar los espacios alrededor de los valores, siendo así único que debes capturar son los valores y no más.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 25/01/2014 a las 21:17 Razón: agrega [^:]+? para evitar espacios de sobra
  #3 (permalink)  
Antiguo 26/01/2014, 14:04
 
Fecha de Ingreso: octubre-2009
Mensajes: 29
Antigüedad: 15 años
Puntos: 4
Respuesta: Expresión regular que se quede con frases

Muchísimas gracias, tienes razón en eso de que la tuya es más bonita y, con algún ajuste para algún caso que no había comentado funciona perfectamente.

Una cosa, ¿te importaría explicarme para qué sirve el signo de interrogación al final del primer conjunto?

Código:
([^:]+?)
¿Se supone que es para que coja la mínima cadena que cumpla la regla? Es lo que me ha parecido entender en https://developers.google.com/edu/python/regular-expressions, en el apartado Greedy vs. Non-Greedy. Pero he visto que si añado espacios al final de la cadena (cosa que en mi caso a priori no pasa), me los coge:

Código:
'    Tipo de red         : Infraestructura   '
Me devuelve
Código:
[('Tipo de red', 'Infraestructura     ')]
y si modifico la segunda parte de la expresión añadiéndole un signo de interrogación:
Código:
\s*([^:]+?)\s*:\s*([^:]+?)\s*
Me devuelve
Código:
[('Tipo de red', 'I')]
Por tanto no entiendo nada bien el '?' al final de un grupo.

Muchísimas gracias de nuevo y un saludo

Etiquetas: python3, regex
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:34.