Foros del Web » Programando para Internet » Python »

Duda python Expresiones Regulares

Estas en el tema de Duda python Expresiones Regulares en el foro de Python en Foros del Web. Hola a todos!. Tengo algunas dudas con las expresiones regulares de pyhton, lenguaje con el cual estoy empezando. No entiendo el resultado que devuelven estos ...
  #1 (permalink)  
Antiguo 22/04/2011, 14:08
 
Fecha de Ingreso: enero-2011
Mensajes: 23
Antigüedad: 13 años, 3 meses
Puntos: 0
Duda python Expresiones Regulares

Hola a todos!. Tengo algunas dudas con las expresiones regulares de pyhton, lenguaje con el cual estoy empezando.

No entiendo el resultado que devuelven estos dos ejemplos ni su motivo. A ver si podeis ayudarme.

Por ejemplo, si yo defino la siguiente expresion regular:

er = re.compile(r"""
#Para explicar grupo
\b #límite de palabra
(\w* \s)
\b #limite de palabra
""", re.VERBOSE|re.U|re.I)

Y la siguiente frase unicode:

textoU = u"""hace una humedad del 95 %"""


y muestro de la siguiente manera las coincidencias:


print "elm_finditer:"
resultado=re.finditer(er,textoU)
for i in resultado:
print i.group()
print "---"

Me muestra por pantalla:

elm_finditer:
hace
una
humedad
del

Si de la expresión regular elimino el \s dejando solo \w*:

er = re.compile(r"""
#Para explicar grupo
\b #límite de palabra
(\w*)
\b #limite de palabra
""", re.VERBOSE|re.U|re.I)


Obtengo:

elm_finditer:
hace

una

humedad

del

95


Mis dudas son:

1- Si para el primer caso estoy diciendo que me muestre todas las palabras que van seguidas de espacio porque no muestra 95?.

2. Si el el segundo caso estoy diciendo que muestre todas las palabras, y las muestra, porque me crea espacios en la lista que devuelve, es decir porque no devuelve todas las palabras seguidas?.

3. Podrias explicarme exactamente para que se usa y el uso correcto de \b ?, porque me da que aunque lo use no lo debo tener muy claro...

Gracias a todos.
  #2 (permalink)  
Antiguo 22/04/2011, 19:25
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda python Expresiones Regulares

Cita:
Iniciado por javie_85 Ver Mensaje
Hola a todos!
Holaaaaaaa javie_85!!

Cita:
Iniciado por javie_85 Ver Mensaje
1- Si para el primer caso estoy diciendo que me muestre todas las palabras que van seguidas de espacio porque no muestra 95?.
De hecho estas pidiendo un limite de palabra seguido (\b) seguido de zero o mas caracteres de palabra (\w*) seguido de un espacio en blanco (\s) seguido de un limitador de palabra (\b).

Cita:
Iniciado por javie_85 Ver Mensaje
2. Si el el segundo caso estoy diciendo que muestre todas las palabras, y las muestra, porque me crea espacios en la lista que devuelve, es decir porque no devuelve todas las palabras seguidas?.
¿Como que por que te devuelve eso? Si eso es lo que le pediste al motor regex.

Cita:
Iniciado por javie_85 Ver Mensaje
3. Podrias explicarme exactamente para que se usa y el uso correcto de \b ?, porque me da que aunque lo use no lo debo tener muy claro...
Claro que si este es tu principal problema. Ver explicación.

En pocas palabras los limitadores de palabras (\b) actúan de la siguiente manera.
Código:
\b no captura ningún carácter
1.- Antes del primer carácter de la cadena, si el primer carácter de la cadena es un carácter de palabra.
2.- Después del ultimo carácter de la cadena, si el ultimo carácter es un carácter de palabra.
3.- Entre 2 caracteres de la cadena, donde uno es un carácter tipo palabra y el otro no.
Para ponerlo simple captura "solamente las palabras enteras"
Tus ejemplos actúan como deben. Pero lo que pones en tu expresión regular no es lo que quieres. Explicación:
Código:
#Paso 1
#Coincide \b por que es el inicio de la cadena y el primer caracter es un caracter de palabra
#"hace una humedad del 95 %"
#^ Aqui coincide \b

#Paso 2
#"hace una humedad del 95 %"
#     ^Coincide \w*\s hasta aqui

#Paso 3
#"hace una humedad del 95 %"
#      ^Coincide \b por que el siguiente caracter es un caracter de palabra y el anterior no

#Paso 4
#"hace " es un grupo

#Paso 5
#"hace una humedad del 95 %"
#      ^Inicio de la cadena, aqui coincide \b

#Paso 6
#"hace una humedad del 95 %"
#         ^Coincide \w*\s

#Paso 7
#"hace una humedad del 95 %"
#          ^Coincide \b por que el sig caracter es un caracter de palabra y el anterior no

#Paso 8
#"una " se hace grupo

#....

#Paso N
#"hace una humedad del 95 %"
#                      ^Concide \b

#Paso N+1
#"hace una humedad del 95 %"
#                        ^Concide \w*\s

#Paso N+1
#"hace una humedad del 95 %"
#                         ^NO Concide \b el anterior caracter es un espacio, pero el sig. no es un caracter de palabra
Para tu siguiente ejemplo hace exactamente lo mismo pero sin el espacio.


Ejemplo de uso:
Código:
\b\w\b
Para terminar y en mi humilde opinión no deberías de usar regex para cosas tan simples como estas. Con esto bastaría usar el método split() para separar todo en "palabras".

Recuerda:
Cita:
Iniciado por Jamie Zawinski
Algunas personas cuando se enfrentan a un problema piensan “Ya sé, ¡usaré expresiones regulares!”

Ahora tienen dos problemas.
  #3 (permalink)  
Antiguo 23/04/2011, 04:04
 
Fecha de Ingreso: enero-2011
Mensajes: 23
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Duda python Expresiones Regulares

razpeitia muchisicmas gracias, me has aclarado muchas cosas.

En primer lugar decir que soy consciente de los problemas que conlleva usar ER, los estoy viviendo vamos y en segundo que tambien se que para mi ejemplo usar ER es complicarse la vida, pero esque simplemente era un ejemplo muy sencillo para poder "dominar" ER, pero aun asi gracias por avisar.

En fin, no sabes lo bien que me ha venido entender la puñetera \b xD. Muchas gracias.
  #4 (permalink)  
Antiguo 23/04/2011, 04:42
 
Fecha de Ingreso: enero-2011
Mensajes: 23
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Duda python Expresiones Regulares

razpeitia una cosa a la que me acabo de dar cuenta que o no me respondiste o no lo he visto, a que se debe que el resultado de

Código:
print "elm_finditer:"
resultado=re.finditer(er,textoU)
for i in resultado:
print i.group()
print "---"
devuelva una lista pero SEPARADA por una linea en blanco?, es decir, no devuelve:

Código:
elm_finditer:
hace
una 
humedad
. . .
sino:

Código:
elm_finditer:
hace

una

humedad

del

95
Por cierto, gracias de nuevo!!

Última edición por javie_85; 23/04/2011 a las 04:45 Razón: fallo tipografico
  #5 (permalink)  
Antiguo 23/04/2011, 11:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda python Expresiones Regulares

Claro que respondí.
Cita:
Iniciado por razpeitia
Para tu siguiente ejemplo hace exactamente lo mismo pero sin el espacio.
Pero asumí que con el primer ejemplo bastaba. Básicamente hace lo mismo pero sin el espacio en blanco.

De todas formas aquí te lo explico.
Código:
#Paso 1
#Coincide \b por que es el inicio de la cadena y el primer caracter es un caracter de palabra
#"hace una humedad del 95 %"
#^ Aqui coincide \b

#Paso 2
#"hace una humedad del 95 %"
#    ^Coincide \w* hasta aqui

#Paso 3
#"hace una humedad del 95 %"
#    ^Coincide \b por que el anterior caracter es un caracter de palabra y el siguiente no

#Paso 4
#"hace" es un grupo

#Paso 5
#"hace una humedad del 95 %"
#     ^Aqui coincide \b

#Paso 6
#"hace una humedad del 95 %"
#     ^Coincide \w*

#Paso 7
#"hace una humedad del 95 %"
#     ^Coincide \b por que el anterior caracter es un caracter de palabra y el sig no

#Paso 8
#"" se hace grupo

#....

#Paso N
#"hace una humedad del 95 %"
#                      ^Concide \b

#Paso N+1
#"hace una humedad del 95 %"
#                       ^Concide \w*

#Paso N+1
#"hace una humedad del 95 %"
#                       ^Concide \b el sig caracter es un espacio y el anterior es un caracter de palabra

#Paso N+2
#"95" se hace un grupo

#Paso N+3
#"hace una humedad del 95 %"
#                        ^Concide \b

#Paso N+4
#"hace una humedad del 95 %"
#                        ^Concide \w*

#Paso N+5
#"hace una humedad del 95 %"
#                        ^Concide \b

#Paso N+6
#"" se hace un grupo
Lo que tu quieres esto:
Código Python:
Ver original
  1. #coding: utf-8
  2. import re
  3. er = re.compile(r"""
  4. #Para explicar grupo
  5. \b #límite de palabra
  6. (\w+)
  7. \b #limite de palabra
  8. """, re.VERBOSE|re.U|re.I)
  9.  
  10. textoU = u"""hace una humedad del 95 %"""
  11.  
  12.  
  13. print "elm_finditer:"
  14. resultado=re.finditer(er,textoU)
  15. for i in resultado:
  16.     print repr(i.group())
  17. print "---"
  #6 (permalink)  
Antiguo 23/04/2011, 12:26
 
Fecha de Ingreso: enero-2011
Mensajes: 23
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Duda python Expresiones Regulares

razpeitia gracias por la ayuda, pero creo que sigo sin entender lo del espacio... Si que entiendo la diferencia de poner el \s y no ponerlo, si lo pongo básicamente entiendo que el \s forma parte de la cadena que busco. Ahora bien no entiendo por ejemplo porque si uso en la ER \b\w*\b me aparecen lineas en blanco en la salida del print y si uso \b\w+\b no.

A su vez he probado a introducir este texto en un fichero:
Código Python:
Ver original
  1. #coding: utf-8
  2. import re
  3. import codecs
  4.  
  5. er = re.compile(r"""
  6. #Para explicar grupo
  7. \b #límite de palabra
  8. (\w*)
  9. \b #limite de palabra
  10. """, re.VERBOSE|re.U|re.I)
  11.  
  12. textoU = u"""hace una humedad del 95 %"""
  13.  
  14.  
  15. print "elm_finditer:"
  16. resultado=re.finditer(er,textoU)
  17. for i in resultado:
  18.     print i.group()
  19. print "---"
  20.  
  21.  
  22. lista =  er.sub(r"""\1\n""",textoU)
  23.  
  24. f_salida= codecs.open("fich_prueba5.txt",'w',"utf-8")
  25. for j in lista:
  26.     f_salida.write(j)
  27. f_salida.close


y he visto que me devuelve un fichero de esta forma, independientemente de si he usado el \b\w+\b o el \b\w*\b.
Código Python:
Ver original
  1. hace
  2.  una
  3.  humedad
  4.  del
  5.  95
  6.  %


Me mete un espacio delante de las palabras a partir de la primera, eso a que se debe?.

Por cierto para que me sirve a mi el repr()?.

Muchas gracias, como ves estoy hecho un lio...
  #7 (permalink)  
Antiguo 23/04/2011, 13:07
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda python Expresiones Regulares

Cita:
Iniciado por javie_85
Ahora bien no entiendo por ejemplo porque si uso en la ER \b\w*\b me aparecen lineas en blanco en la salida del print y si uso \b\w+\b no.
Eso es por que \w* es cero o mas caracteres entonces una cadena vacía coincide con esto. Por el otro lado \w+ fuerza que exista al menos un carácter.

En cuanto al método sub:
1.- No devuelve una lista. Devuelve un string.
2.- sub reemplaza cada grupo que coincida con el patrón dado y el texto dado. (En este caso cada grupo 1 que capturaste le añades un enter '\n')

La función repr retorna un string que es la representación del objeto como string.
Por ejemplo:
Código:
>>> s = "aaa\nbbb"
>>> print s
aaa
bbb
>>> print repr(s)
"aaa\nbbb"
  #8 (permalink)  
Antiguo 23/04/2011, 17:29
 
Fecha de Ingreso: enero-2011
Mensajes: 23
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Duda python Expresiones Regulares

razpeitia muchas gracias!, me ha resultado muy útil tu ayuda. Creo que al fin lo tengo todo claro.

Etiquetas: expresiones, regulares
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 10:19.