6

pyparser を使用して、16 進数からテキストへのコンバーターの出力を処理しています。スペースで区切られた 1 行あたり 16 文字が出力されます。16 進値が ASCII 印刷可能文字の場合、その文字が印刷されます。それ以外の場合、コンバーターはピリオド (.) を出力します。

ほとんどの場合、出力は次のようになります。

. a . v a l i d . s t r i n g .
. a n o t h e r . s t r i n g .
. e t c . . . . . . . . . . . .

この行を記述するための私の pyparsing コードは次のとおりです。

dump_line = 16 * Word(printables, exact=1)

これは、16 進数からテキストへのコンバーターが 16 進数値 0x20 に到達し、スペースが出力されるまでは正常に機能します。

l i n e . w . a .   s p a c e .

その場合、pyparsing は出力されたスペースを無視し、次の行から文字を取得して 16 文字の「クォータ」を作成します。

誰かがスペースで区切られた16文字を期待するようにpyparsingに指示する方法を提案できますか?スペースも有効な文字になる可能性がありますか?

前もって感謝します。J

4

2 に答える 2

6

これにはかなりの空白があるため、先頭の空白をそのままにしておくように文字式に指示する必要があります。以下のdumpcharの定義で、これがどのように行われるかを確認してください。

hexdump = """\
. a . v a l i d . s t r i n g . 
. a n o t h e r . s t r i n g . 
. e t c . . . . . . . . . . . . 
l i n e . w . a .   s p a c e . 
. e t c . . . . . . . . . . . . 
"""

from pyparsing import oneOf, printables, delimitedList, White, LineEnd

# expression for a single char or space
dumpchar = oneOf(list(printables)+[' ']).leaveWhitespace()

# convert '.'s to something else, if you like; in this example, '_'
dumpchar.setParseAction(lambda t:'_' if t[0]=='.' else None)

# expression for a whole line of dump chars - intervening spaces will
# be discarded by delimitedList
dumpline = delimitedList(dumpchar, delim=White(' ',exact=1)) + LineEnd().suppress()

# if you want the intervening spaces, use this form instead
#dumpline = delimitedList(dumpchar, delim=White(' ',exact=1), combine=True) + LineEnd().suppress()

# read dumped lines from hexdump
for t in dumpline.searchString(hexdump):
    print ''.join(t)

プリント:

_a_valid_string_
_another_string_
_etc____________
line_w_a_ space_
_etc____________
于 2011-01-04T22:15:56.977 に答える
1

スペースを削除する別の方法を使用することを検討してください

>>> s=". a . v a l i d . s t r i n g ."
>>> s=s[::2]
>>> s
'.a.valid.string.'
于 2011-01-04T22:19:29.643 に答える