gpt4 book ai didi

python - pyparsing - 用千位分隔符解析数字

转载 作者:行者123 更新时间:2023-12-04 01:18:23 26 4
gpt4 key购买 nike

所以我在制作解析器时,发现了一个问题。事实上,为了解析数字,我有:

from pyparsing import Word, nums
n = Word(nums)

这适用于没有千位分隔符的数字。例如,n.parseString("1000", parseAll=True) 返回 (['1000'], {}),因此有效。

但是,当我添加千位分隔符时它不起作用。事实上,n.parseString("1,000", parseAll=True) 引发了 pyparsing.ParseException: Expected end of text, found ',' (at char 1), (line:1, col :2)

如何解析带有千位分隔符的数字?我不只是想忽略逗号(例如,n.parseString("1,00", parseAll=True) 应该返回错误,因为它不是数字)。

最佳答案

纯 pyparsing 方法将使用 Combine 来包装一系列代表您在正则表达式中看到的不同字段的 pyparsing 表达式:

import pyparsing as pp

int_with_thousands_separators = pp.Combine(pp.Optional("-")
+ pp.Word(pp.nums, max=3)
+ ("," + pp.Word(pp.nums, exact=3))[...])

我发现像这样构建数值表达式会导致解析时间慢得多,因为所有这些单独的部分都是独立解析的,具有多个内部函数和方法调用(这在 Python 中是真正的性能 killer )。因此,您可以使用 Regex 将其替换为表达式:

# more efficient parsing with a Regex
int_with_thousands_separators = pp.Regex(r"-?\d{1,3}(,\d{3})*")

您还可以使用 Jan 发布的代码,并将编译后的正则表达式传递给正则表达式构造函数。

要将解析时转换为 int,请添加一个去除逗号的解析操作。

# add parse action to convert to int, after stripping ','s
int_with_thousands_separators.addParseAction(
lambda t: int(t[0].replace(",", "")))

我喜欢使用 runTests 来检查像这样的小表达式 - 编写一系列测试字符串很容易,输出显示解析结果或带有解析失败位置的注释输入字符串. (“1,00” 作为故意错误包括在内,以演示 runTests 的错误输出。)

int_with_thousands_separators.runTests("""\
1
# invalid value
1,00
1,000
-3,000,100
""")

如果要解析实数,请添加部分以表示尾随小数点和后面的数字。

real_with_thousands_separators = pp.Combine(pp.Optional("-") 
+ pp.Word(pp.nums, max=3)
+ ("," + pp.Word(pp.nums, exact=3))[...]
+ "." + pp.Word(pp.nums))

# more efficient parsing with a Regex
real_with_thousands_separators = pp.Regex(r"-?\d{1,3}(,\d{3})*\.\d+")

# add parse action to convert to float, after stripping ','s
real_with_thousands_separators.addParseAction(
lambda t: float(t[0].replace(",", "")))

real_with_thousands_separators.runTests("""\
# invalid values
1
1,00
1,000
-3,000,100
1.

# valid values
1.732
-273.15
""")

关于python - pyparsing - 用千位分隔符解析数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62967548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com