从带有pyparsing的字符串中获取所有数字作为列表

时间:2015-04-26 22:08:47

标签: python regex parsing pyparsing

我需要使用pyparsing从一些自由文本中提取所有数字作为列表。数字将包括科学记数法。

这是我的语法:

digits = '0123456789'
#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. 它只给我第一个匹配的号码
  3. 对于问题1,我尝试使用文档中的Combine类,最后是这样的:

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

    但由于某种原因,这会停止匹配整数,只是给了我这个:

    (['5'], {})
    

    对于问题2,我在文档中找不到类似于“findall”的任何内容。唯一的选择是看n-gram(比如从5克或者什么开始),看看它们是否匹配,如果不匹配则再缩小。数字之间的文本可以是任何东西(它不是像我在这里看到的其他问题中那样像逗号分隔的数字列表一样干净)

    但我觉得必须有更好的方法。任何帮助表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

我只需要使用searchString而不是parseString(对于问题2)并使用asList()方法来获取列表(匹配字符)。然后我只需加入各个列表来获取字符串(问题1)。

答案 1 :(得分:1)

要让pyparsing为您执行字符串连接,请将dec_num更改为:

dec_num = pp.Combine(strt_num+decimal+strt_num)