Foros del Web » Programando para Internet » Python »

problema con las expresiones regulares

Estas en el tema de problema con las expresiones regulares en el foro de Python en Foros del Web. bueno para esta parte del programa que estoy desarrollando me he encontrado con un tema que no habia mirado aun, las expresiones regulares. planteo lo ...
  #1 (permalink)  
Antiguo 02/12/2008, 06:32
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Mensaje problema con las expresiones regulares

bueno para esta parte del programa que estoy desarrollando me he encontrado con un tema que no habia mirado aun, las expresiones regulares.
planteo lo que intento por si hay alguien con tiempo que le apetezca acer un aporte:
primero el archivo que estoy editando tiene caracteres genuinamente hexadecimales, lo que significa que para poder estructurarlo a mi gusto tengo que leerlo "" el programa" en hexadecimal, hasta aqui bien, lo hago asi:
Código PHP:
def leer():
    
open("GameStringTable.dat""r")
    
texto x.read()
    
x.close()
    return 
texto

texto 
leer()
hexa texto.encode("hex"
asi texto es texto legible, y hexa es el codigo hexadecimal.
para los que no esten familiarizados con el codigo hex, cada letra equivale a un conjunto de dos caracteres Alfanumerico.
la peculiaridad de este archivo es que tiene caracteres que son 00 lo cual no equivale a nada, bueno, referente a las expresiones ordinarias:
quiero que busque primero, la siguiente cadena "00 00 00 00 XX" donde XX seria cualquier cosa que no sea 00, esto delimita el comienzo del marcador, y el final del marcador seria "XX 00 00" luego volveria a buscar un principio de marcador luego otro final, y asi arta el final del archivo, todos los principios y finales de marcador seran almacenados en un diccionario pra su proximo proceso.

yo voy a seguir estudiando las excepciones regulares, si alguien me quiere hecar una mano es bienvenido.


Un saludo

Última edición por bloodyogos; 05/12/2008 a las 10:38
  #2 (permalink)  
Antiguo 02/12/2008, 08:02
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

Podría ser una expresión regular como esta:
Código:
0{8}[1-9a-f]{2}([\da-f]+)00[1-9a-f]{4}
Usando el método findall obtendrás todo lo que esté contenido entre esos delimitadores.

Explicación:
0{8} -> 8 ceros
[1-9a-f]{2} -> Dos caracteres entre 1 y 9 o a y f
( -> Grupo
[\da-f]+ -> dígitos (0-9) o caracteres entre a y f (+ -> uno o más veces)
) -> Cierre Grupo
00[1-9a-f]{4} -> Dos ceros seguidos de 4 caracteres entre 1 y 9 o a y f
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 02/12/2008, 08:48
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

gracias figura eres muy grande, david el grande
  #4 (permalink)  
Antiguo 03/12/2008, 03:02
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Pregunta Respuesta: problema con las expresiones regulares

vale pero hay un problema, necesito que los evalue de 2 en 2, de forma que un caracter diferente de 00 pueda ser 02 o 0f o5d, pero no 00 y ese es mi problema, a esta marcha lo unico que se me ocurre es hacer un bucle que vaya comparando 5 puntos consecutivos del texto evaluando cada uno si es igual a 00 o no, y poner dos estructuras en if una para el principio y otra para el final, y que si coincide la estructura guarde el punto del texto en la lista.
seria asi:
Código PHP:
def guardar(textoarchivo):    
    
x=open(archivo"w")
    
x.write(texto)
    
x.close()
    return 
0

def leer
():
    
open("GameStringTable.data""r")
    
texto x.read()
    
x.close()
    return 
texto
def cerono
(carac):
       if 
carac == "00":
                
resultado True
       
else:
                
resultado False
       
return resultado

texto 
leer()
hexa texto.encode("hex")
seguir True
comienzo 
= [ ]
final = [ ]
limite len(hexa)
punta 0
com 
True
fustificador 
= [TrueTrueTrue]
while 
seguir:
           
puntb punta +2
           puntc 
puntb +2
           puntd 
puntc +2
           caraca 
hexa[punta:puntb]
           
caracb hexa[puntb:puntc]
           
caracc hexa[puntc:puntd]
           
fustificador[0] = cerono(caraca)
           
fustificador[1] = cerono(caracb)
           
fustificador[2] = cerono(caracc)

        if 
fustificador == [ True FalseFalse] and com == True:
                           
#Esto seria el comienzo de un texto
                           
comienzo comienzo + [puntb]
            
com False
        
if fustificador == [ FalseFalseTrue] and com == False:
                           
#Esto sera el finalde un texto
                           
final = final + [puntc]
                           
com True
        punta 
punta 2
           
if punta limite :
                           
seguir False
seguir2 
True
nu 
0
limite2 
len(comienzo)
while 
seguir2:
    
frase hexacomienzo[nu] : final [nu] ]
    print 
frase
    
print frase.decode("hex")
    
nu nu 1
    
if nu limite2:
        
seguir2 False 

Edito:
este codigo funciona correctamente... lo unico que tarda unos segundos en escanear todo el archivo

Última edición por bloodyogos; 04/12/2008 a las 05:42
  #5 (permalink)  
Antiguo 03/12/2008, 16:29
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

No entendí muy bien . Pero al parecer lo que quieres es que en lugar de 2 caracteres que sean diferentes de 0 solo quieres que no sean 00, o sea, puede haber un 0 entre ellos, ¿es eso? Ya que si lo es sólo habrá que hacer una pequeña modificación en la expresión regular para lograrlo .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 04/12/2008, 05:09
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

si exacto, eso era lo que queria, si me explicas como se hace eso estoy seguro que la aplicacion iria mucho mas rapido.

Por cierto, aprobecho para consultarte una cosa, ¿existe algun tipo que ventana auxiliar que sea el porcentaje de trabajo realizado en wxPython? como la de los instaladores que sale 50% con una barra grafica... ¿hay algo asi en wxPython ?
  #7 (permalink)  
Antiguo 04/12/2008, 11:17
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

wxPython no lo he usado, así que no sabría decirte.

En cuanto a la expresión regular, no soy un experto, pero creo que con esto valdría:
Código:
0{8}(?:0[1-9a-f]|[1-9a-f]0)([\da-f]+)00(?:0[1-9a-f]|[1-9a-f]0){2}
Saludos .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 05/12/2008, 02:07
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

ante todo muchisimas gracias, podrias ¿explicarlo para que lo entienda¿.... seria la leche me gustaria aprender a hacer estas expresiones regulares tan guais por cierto luego findall genera una lista ¿no? eso le quitara mucha pesadez al programa, pero necesito sabe alterarlo, espero tu respuesta.
  #9 (permalink)  
Antiguo 05/12/2008, 05:10
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

Pues, no es que haya cambiando mucho:
0{8} ----- 8 ceros
(?: -------- En este caso cambia el sentido del paréntesis, en lugar de ser un grupo o subpatron que podamos obtener posteriormente sirve más bien como un... no sabrá decir una palabra que lo describa, ¿separador?
0[1-9a-f]|[1-9a-f]0 ------ Aquí está la gracia de lo que hicimos con el paréntesis, indicamos dos opciones al motor, 1) 0 seguido de un carácter de entre 1 y 9 o entre a y f. 2) un carácter de entre 1 y 9 o entre a y f seguido de un 0. Las dos opciones son separadas por el carácter |

El resto continúa más o menos como estaba .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #10 (permalink)  
Antiguo 05/12/2008, 05:42
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

ok, entonces cubre 8 ceros y luego un caracte 0* o *0 ... y se puede agregar otro que sea ** en el que ninguno de los 2 es 0, si se puede o ya esta inplicito "no soy capaz de verlo " tendria todo lo que necesito.

de todas mira a ver que creo que esto sera mas facil, buscar un fragmento de texto que sea

00 00 00 un grupo de texto con todas la combinaciones excepto ""00"" 00 00 00

En serio, muchas gracias, te estoy muy agradecido.

Última edición por bloodyogos; 05/12/2008 a las 05:49
  #11 (permalink)  
Antiguo 05/12/2008, 05:56
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

Cierto . Pues, podemos agregar esa opción:
Cita:
0{8}(?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2})([\da-f]+)00(?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}){2}
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #12 (permalink)  
Antiguo 05/12/2008, 06:32
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

heeee, mola y no es tan chungo... lo que no me queda claro es lo de los 00 en medio de la expresion, si se supone que solo deben estar al principio y al final... dios.... acabo de leer mi primer post... me equivoque escribiendo... soy lerdoooo... en fin seria asin:

00 00 00 00 XX XX (grupo se cualquier cosa menos 00) XX XX 00 00 00 00

donde XX seria lo que hemos declarado asi pues... ¿seria asi?

0{8} (?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}) ([\da-f]+) (?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}) 0{8}

si es asi ya se usarlo y te debo poco menos que la vida
  #13 (permalink)  
Antiguo 05/12/2008, 06:44
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

Casi . Fíjate, leyendo tu expresión regular, sería 0{8} (?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}) ([\da-f]+) (?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}) 0{8}:
Código:
00 00 00 00 XX (grupo de caracteres hexadecimales cualquiera) XX 00 00 00 00
¿Qué falta? 2 XX en ambos lados, además, lo que está dentro del grupo no filtra si sólo hay 00 u otra cosa.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #14 (permalink)  
Antiguo 05/12/2008, 08:57
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

filtro = """
0{8} # los 8 ceros del principio
(?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}) # los 2 caracteres que no sean 00 del principio
(?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]+) # bloque central que no sea 00 de longuitud indeterminada
(?:0[1-9a-f]|[1-9a-f]0|[1-9a-f]{2}) # los 2 caracteres que no sean 00 del final
0{8} # los 8 ceros del final
"""
¿asi?

y luego:

lista =re.findall(filtro, texto, re.VERBOSE)

Última edición por bloodyogos; 05/12/2008 a las 09:10
  #15 (permalink)  
Antiguo 05/12/2008, 09:03
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

Pregunto, ¿no debe haber ningún 00 en el bloque intermedio?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #16 (permalink)  
Antiguo 05/12/2008, 10:01
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

nop... eso fue una colada en el planteamiento... sorry
  #17 (permalink)  
Antiguo 05/12/2008, 10:31
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

bueno, esto es casi casi lo que necesito...
pattern ="0{2}(?:0[1-9a-z]|[1-9a-z]0|[1-9a-z]{2})(?:0[1-9a-z]|[1-9a-f]0|[1-9a-z]+)(?:0[1-9a-z]|[1-9a-z]0|[1-9a-z]{2})0{2}"

self.list_box_2 = re.findall(pattern, hexa)

el unico punto que pincha "y tambien el ultimo" es, que el grupo central ha de ser par... por que sino coge cadenas impares, que a lo mejor el primer caracter empezaba por 0 o el ultimo acababa en 0 y entonces es incorrecto, le tendria que decir al bloque central que su longitud deberia ser multiplo de 2, es decir par, nunca impar.

estoy casi al final del camino, aunque podria procesar el texto obtenido despues de forma que si es impar... no... tiene que salir del filtro... diossss... por que no me aficionaria a cazar mariposas...
  #18 (permalink)  
Antiguo 05/12/2008, 10:48
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

¿Podrías volver a plantear la cuestión? Porque con lo que se vino modificando, y con tus propias modificaciones en la expresión regular, ahora ya no la tengo clara.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #19 (permalink)  
Antiguo 05/12/2008, 11:54
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

Ok

hay un archivo de texto que si lo pasa a hexadecimal, es un "mar" de 00 y hay algunas "islitar" que son caracteres de 3 tipos 0*, *0, o ** siendo * cualquier cosa menos 0.

asi, para encontrarlas pongo que encuentre 00 seguido de (0*, *0, o **), luego en medio ha de ir un numero indeterminado de (0*, *0, o **) par "por que cada letra ocupa 2 lugares" y termina con un (0*, *0, o **) seguido de 00. y eso es lo que se considera una cadena valida de texto.

he aislado el problema, no resuelto, en el bloque central,

(?:0[1-9a-z]|[1-9a-f]0|[1-9a-z]+)

solo se establece que tenga 1 caracter o mas, bien en el primer caso:

0[1-9a-z] # va bien, 0* son 2 caracteres

el segundo caso:

[1-9a-f]0 #sigue bien *0 son 2 caracteres

y el ultimo caso:

[1-9a-z] # este es el que falla, por que le da la posibilidad de coger un solo caracter y esto hace que las cadenas sehan impares y por tanto imposible hacer decode("hex")

en los del principio y el final no falla porque se especifica que han de ser 2 caracteres de uno de los 3 casos, pero en el bloque central no se establece una limitacion par de caracteres.

ese es mi problema, he probado a hacer varias cosas y no funciona, o me dice error de sintaxis o hace cosas muy extrañas.

el bucle que tenia antes era lento de pelotas, pero al final rulaba xD no en serio, necesito saber como arreglar esto...

Gracias una vez mas
  #20 (permalink)  
Antiguo 05/12/2008, 12:04
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: problema con las expresiones regulares

El último caso podría ser [1-9a-f]{2}, así, sólo permitirá dos de esos caracteres .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #21 (permalink)  
Antiguo 06/12/2008, 03:48
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

no pirula... dice invalid expresion, pero lo solucione, tal como esta la expresion coge -00 texto 00- y sabemos que la expresion falla a la mitad, por tanto el principio estara bien el medio puede estar mal y el final por extension estara mal, peeero si el numero de len(texto) es impar es que esta mal y le sobrara un cero al final, fin del problema, en la funcion que tengo para quitarle los 00 del principio y del final pongo un if, que si es impar de atras le quite 000 en vez de 00, y funciona xD

ala, funciona mil veces mas rapido gracias a ti david, eres muuuy grande, grandisimo "metaforicamente hablando "

Un saludo,
David Vázquez
  #22 (permalink)  
Antiguo 08/12/2008, 02:03
 
Fecha de Ingreso: junio-2008
Mensajes: 25
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: problema con las expresiones regulares

bueno, al final he descubierto un par de cosas que me han ayudado a solucionar mi problema, la primera, se puese hacer referencia a un valor hexadecimal sin necesidad de comvertir el texto a hexadecimal solo hay que escribir el valor hexacimal a continuacion de una barra \x , ademas, descubri que el caracter ^ dentro de cortchetes no significa principio, sino que es negacion de lo que va a continuacion.

asi pues la expresion seria asi:

"[^\x00]+"


¿¿que tal fistros?? mas simple¿ no?

Última edición por bloodyogos; 08/12/2008 a las 02:13
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 16:23.