使用 pyparsing 从字符串中获取所有数字作为列表
Geting all numbers as a list from a string with 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,我尝试使用文档中的 Combine class,最后像这样:
num = pp.Combine(sci_num ^ dec_num ^ strt_num)
但是由于某种原因这停止匹配整数并且只给了我这个:
(['5'], {})
对于问题2,我在文档中找不到类似"findall"的内容。唯一的选择是 see 是制作 n-gram(比如从 5 克或其他东西开始),看看它们是否匹配,如果不匹配则将 n 变小。数字之间的文本可以是任何东西(它不像我在这里看到的其他问题那样像逗号分隔的数字列表那样干净)
但我觉得一定有更好的方法。任何帮助表示赞赏。谢谢!
我只需要使用 searchString 而不是 parseString(对于问题 2)并使用 asList() 方法来获取(匹配字符的)列表列表。然后我只是加入各个列表来获取字符串(对于问题 1)。
要让 pyparsing 为您进行字符串连接,请将 dec_num 更改为 :
dec_num = pp.Combine(strt_num+decimal+strt_num)
我需要使用 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,我尝试使用文档中的 Combine class,最后像这样:
num = pp.Combine(sci_num ^ dec_num ^ strt_num)
但是由于某种原因这停止匹配整数并且只给了我这个:
(['5'], {})
对于问题2,我在文档中找不到类似"findall"的内容。唯一的选择是 see 是制作 n-gram(比如从 5 克或其他东西开始),看看它们是否匹配,如果不匹配则将 n 变小。数字之间的文本可以是任何东西(它不像我在这里看到的其他问题那样像逗号分隔的数字列表那样干净)
但我觉得一定有更好的方法。任何帮助表示赞赏。谢谢!
我只需要使用 searchString 而不是 parseString(对于问题 2)并使用 asList() 方法来获取(匹配字符的)列表列表。然后我只是加入各个列表来获取字符串(对于问题 1)。
要让 pyparsing 为您进行字符串连接,请将 dec_num 更改为 :
dec_num = pp.Combine(strt_num+decimal+strt_num)