Pyparsing: пробел как действительный токен - PullRequest
7 голосов
/ 05 января 2011

Я использую 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 . . . . . . . . . . . .

Мой код преобразованияЧтобы описать эту строку:

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

Это работает нормально, пока преобразователь шестнадцатеричного текста не достигнет шестнадцатеричного значения 0x20, что заставляет его выводить пробел.

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

В этом случае pyparsing игнорирует выводимый пробел и занимает символы из следующей строки, чтобы сделать «квоту» из 16 символов.

Может кто-нибудь подсказать, как я могу сказать, что pyparsing ожидает 16 символов, каждый из которых разделенчерез пробел, где пробел также может быть действительным символом?

Заранее спасибо.J

Ответы [ 2 ]

6 голосов
/ 05 января 2011

Поскольку это имеет значительный пробел, вам нужно указать выражение вашего персонажа, чтобы оставить один пробел в начале.Посмотрите, как это делается ниже в определении 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____________
2 голосов
/ 05 января 2011

Попробуйте использовать другой способ удаления пробелов

>>> s=". a . v a l i d . s t r i n g ."
>>> s=s[::2]
>>> s
'.a.valid.string.'
...