Как разобрать поплавки в pyparsing, в том числе со знаком минус - PullRequest
0 голосов
/ 23 января 2019

Итак, у меня есть следующие строки (каждая строка является строкой файла .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"

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

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

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

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

1 Ответ

0 голосов
/ 23 января 2019

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 - это предопределенное выражение анализа с плавающей запятой, которое будет обрабатывать начальные знаки, и преобразовать строку в число с плавающей точкой во время разбора, чтобы при получении значения от анализатора оно уже было преобразовано в число с плавающей точкой.

...