2012-06-19 24 views
5

Tôi vừa mới bắt đầu sử dụng python/pyparsing để xử lý một chuỗi các giá trị hex và tôi đang gặp rắc rối với điều này: xem xét chuỗi này:Sử dụng thẻ như biến trong pyparsing

string = "10020304059917368584304025326" 

Tôi muốn cuối cùng kết quả là:

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

Giả sử rằng 04 là thẻ có nghĩa là dữ liệu (cùng khái niệm như trong ASN.1) và 05 là kích thước của dữ liệu đó. Tôi không thấy cách sử dụng biến kích thước trên mã pyparsing. Điều tốt nhất mà tôi có thể làm là:

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

Mọi trợ giúp sẽ được đánh giá cao.


PS: Sau khi sự giúp đỡ của Hooked, mã cuối cùng của tôi là:

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()) 

nào in:

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

Hope this helps trong tương lai.

Trả lời

2

Tôi hỏi cùng một câu hỏi theo nghĩa chung hơn, Can a BNF handle forward consumption?. Câu trả lời cho câu hỏi đó là không, vì ngữ cảnh tự do ngữ cảnh không thể biết điều gì sắp xảy ra. Rất may, pyparsing còn hơn là một ngữ pháp ngữ cảnh tự do là tác giả của gói points out:

Pyparsing bao gồm các helper countedArray mà thực hiện chính xác những gì bạn yêu cầu. Phải có một đối số expr duy nhất và sẽ phân tích cú pháp một số nguyên theo sau là 'n' thể hiện của expr

Một giải pháp hoàn chỉnh hơn với ví dụ tối thiểu được cung cấp trong câu trả lời của ông. Câu hỏi: PyParsing lookaheads and greedy expressions cũng là một tài liệu tham khảo tốt cho những gì bạn đang cố gắng làm là tốt.

+0

Cảm ơn bạn, đây chính xác là những gì tôi cần. – Kiji

0

Điều này có hiệu quả không? Nó không sử dụng pyparsing, nhưng nó ghi lại các danh sách phụ độ dài thay đổi khi nó nhìn thấy '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

Thật không may cho tôi. Ví dụ mà tôi đưa ra chỉ là một phần đơn giản của những gì tôi muốn làm, vì vậy điều quan trọng là tôi sử dụng pyparsing (tôi có một số lượng lớn các thẻ, đại diện cho các kích cỡ khác nhau). Cảm ơn sự giúp đỡ của bạn ! – Kiji

+0

Whammy. Chúc may mắn! – cjohnson318

Các vấn đề liên quan