2015-04-26 2 views
1

Мне нужно извлечь все номера из некоторого свободного текста в виде списка, используя pyparsing. Числа будут включать научную нотацию.Geting все числа как список из строки с pyparsing

Это моя грамматика:

digits = '' 
#straight number = 5, 10 ,65535 
strt_num = pp.Word(digits) 
decimal = pp.Literal('.') 
dec_num = strt_num+decimal+strt_num 

multiply = pp.Literal('×') 
minus = pp.Literal('−') 

sci_num = (dec_num^strt_num)+multiply+'10'+pp.Optional(minus)+strt_num 

num = sci_num^dec_num^strt_num 

num.parseString('5 × 10−5 and then there is also 0.0001') 

Это дает мне:

(['5', '\xc3\x97', '10', '\xe2\x88\x92', '5'], {}) 

Какие две проблемы:

  1. Это дает мне номер в качестве различных соответствующих частей (вместо одна строка)
  2. Это дает мне только первое совпадающее число

Для задачи 1, я пытался использовать Комбайн класс из документации, как это в конце:

num = pp.Combine(sci_num^dec_num^strt_num) 

, но это останавливает соответствие целого числа по какой-то причине и просто дает мне это:

(['5'], {}) 

Для проблемы 2 я не могу найти что-либо в документации, подобной «findall». Единственный вариант - это сделать n-граммы (например, начиная с 5 граммов или что-то еще), посмотреть, совпадают ли они, а затем сделать n меньше, если нет. Текст между цифрами может быть любым (его не что-то чистое, как запятый список номеров, как в других вопросах, которые я видел здесь)

Но я чувствую, что должен быть лучший способ. Любая помощь приветствуется. Благодаря!

ответ

1

Мне просто нужно было использовать searchString вместо parseString (для проблемы 2) и использовать метод asList() для получения списка списков (совпадающих символов). Затем я просто присоединяюсь к отдельным спискам, чтобы получить строки (для проблемы 1).

1

Чтобы Pyparsing сделать конкатенацию для вас, изменение dec_num к:

dec_num = pp.Combine(strt_num+decimal+strt_num) 
Смежные вопросы