我正在使用pyparser处理十六进制文本转换器的输出。每行打印出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)

这可以正常工作,直到十六进制到文本的转换器达到十六进制值0x20,这将使其输出一个空格。
l i n e . w . a .   s p a c e .

在这种情况下,pyparsing会忽略输出的空格,并从下一行占用字符以使“quota”为16个字符。

有人可以建议我如何告诉pyparsing期望16个字符,每个字符之间用空格分隔,其中空格也可以是有效字符?

提前致谢。
Ĵ

最佳答案

由于它具有很大的空格,因此您需要告诉您的字符表达式不要将前导空格留空。请参见下面的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____________

关于python - Pyparsing:将空间作为有效 token ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4598764/

10-12 19:28