Как разобрать поплавки в pyparsing, включая знаки минус

Итак, у меня есть следующие строки (каждая строка является строкой файла .txt), и я создал парсер для анализа первой строки следующим образом:

line1: " N1 0.00000000 0.00000000 0.00000000 Type N Rank 4"

parser1 = Word(alphas + nums) + Word(printables + '.' + printables) + Word(printables + '.' + printables) \
                  + Word(printables + '.' + printables) + Word(alphas) + Word(alphas) + Word(alphas) + Word(nums)

result = (['N1', '0.00000000', '0.00000000', '0.00000000', 'Type', 'N', 'Rank', '4'], {})

Это здорово. Однако после этой строки следуют только числа с плавающей запятой, которые могут иметь или не иметь знака минус, например:

line2 = " -1.064533
      -0.000007      -0.130782       0.044770
       0.335373      -0.000007      -0.000006      -0.451296       0.378061
      -0.000034      -0.990753      -1.404081      -0.000067      -0.000150
                     -0.096208      -0.714299
      -0.017676       0.000019       0.000034       0.804011       0.911492
                      0.000019       0.000027       0.441683       0.107567"

И я попытался использовать следующий синтаксический анализатор, чтобы получить эти числа, но, к сожалению, он также захватит строку 1:

parser2 = Word(printables + '.' + printables)

Есть ли способ анализировать поплавки, которые могут лучше включать печатный знак минус?

Большое спасибо (я новичок в pyparsing, так что будьте суровы, как хотите)


person Gianluca Cientanni    schedule 23.01.2019    source источник
comment
Вместо создания собственного анализатора реальных чисел вы можете использовать тот, который предоставлен в pyaprsing по адресу pyparsing_common.real. Полные онлайн-документы можно найти по адресу pyparsing-docs.readthedocs.io/en/latest. /index.html   -  person PaulMcG    schedule 23.01.2019


Ответы (1)


Word(printables + '.' + printables) не делает то, что вы думаете. printables — это строка, поэтому printables + '.' + printables оценивается как действительно длинная строка, содержащая все печатные символы, за которыми следует точка, а затем снова все печатные символы. Затем эта строка используется для создания объекта Word, который будет соответствовать группе символов, разделенной пробелами, в наборе, ну, всех печатных символов (а поскольку '.' можно печатать, он уже находится в этом наборе).

Я подозреваю, что вы действительно хотите использовать для анализа действительного числа с необязательным начальным знаком минус что-то вроде

Optional('-') + Word(nums) + '.' + Word(nums)`

Обратите внимание, что добавление выполняется с помощью выражений синтаксического анализа, а не строк, переданных в Word. Это будет анализировать «-1.23» как ['-', '1', '.', '23']. Чтобы получить все это в виде одной строки, оберните ее в Combine:

Combine(Optional('-') + Word(nums) + '.' + Word(nums))

Тогда вы получите «-1,23» от использования этого выражения. После этого вам все еще остается преобразовать это в число с плавающей запятой Python, используя встроенную функцию float().

pyparsing_common.real – это предопределенное выражение синтаксического анализа с плавающей запятой, которое будет обрабатывать начальные знаки, и преобразовывать из строки в число с плавающей запятой во время синтаксического анализа, так что, когда вы получаете значение из синтаксического анализатора, оно уже преобразуется в плавать.

person PaulMcG    schedule 23.01.2019