2012-06-19 8 views
5

he recientemente comenzó a usar Python/pyparsing para procesar una cadena de valores hexadecimales y tengo problemas con esto: Considere esta cadena:Uso token como variable en pyparsing

string = "10020304059917368584304025326" 

Quiero final resultado ser la siguiente:

['10', '02', '03', ['04', '05', '9917365843'], ['04', '02', '5326']] 

Suponga que 04 es una etiqueta que significa que los datos (el mismo concepto como en ASN.1), y 05 es el tamaño de los datos. No veo cómo usar la variable de tamaño en el código de pyparsing. Lo mejor que puedo hacer es:

byte = Word(hexnums, exact=2) 
process = byte + byte + byte + Word(hexnums) 
newstring = process.parseString(string) 
print (newstring.dump()) 

Cualquier ayuda sería muy apreciada.


PS: Después de la ayuda de enganchado, mi código final es:

from pyparsing import * 

string = "10 02 03 04 05 99 17 36 58 43 04 02 53 26" 

tag = Word(hexnums, exact=2) 
size = Word(hexnums) 
array = Group(tag + countedArray(size)) 

process = tag + tag + tag + ZeroOrMore(array) 

newstring = process.parseString(string) 
print (newstring.dump()) 

que imprime:

['10', '02', '03', ['04', ['99', '17', '36', '58', '43']], ['04', ['53', '26']]] 

Esperanza esto ayuda en el futuro.

Respuesta

2

Hice la misma pregunta en un sentido más general, Can a BNF handle forward consumption?. La respuesta a esa pregunta fue no, ya que una gramática libre de contexto no puede saber qué viene. Afortunadamente, pyparsing es más que una gramática libre de contexto como el autor del paquete points out:

Pyparsing incluye el ayudante countedArray que hace exactamente lo que se le pregunte. Toma un único argumento expr y analiza un entero seguido de 'n' instancias de expr

En su respuesta se proporciona una solución mucho más completa con un mínimo ejemplo de trabajo. La pregunta: PyParsing lookaheads and greedy expressions es también una buena referencia para lo que intenta hacer también.

+0

Gracias, esto es exactamente lo que necesitaba. – Kiji

0

¿Funcionaría? No utiliza pyparsing, pero registra sublistas de longitud variable cuando ve '04'.

def func(s): 
    d = [] 
    # while s isn't empty 
    while len(s) != 0: 
     b = s[0:2] 
     if b != '04': 
      # if b isn't '04' append it to d 
      d.append(b) 
      # shorten s 
      s = s[2:] 
     else: 
      # take the length, as a string 
      l = s[2:4] 
      # take the length, as an integer 
      n = int(s[2:4]) 
      # record b='04', the length, and then the next values 
      d.append([ b, l, s[4:4+n*2] ]) 
      # shorten s 
      s = s[4+n*2:] 
    return d 
+0

Lamentablemente no es para mí. El ejemplo que di es solo una parte simple de lo que intento hacer, por lo que es fundamental que use pyparsing (tengo una gran cantidad de etiquetas, que representan varios tamaños). ¡Gracias por la ayuda! – Kiji

+0

Whammy. ¡Buena suerte! – cjohnson318

Cuestiones relacionadas