首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PyParsing中,如何将可选的解析结果转换为整数或无(如果不存在)

在PyParsing中,如何将可选的解析结果转换为整数或无(如果不存在)
EN

Stack Overflow用户
提问于 2017-03-21 17:01:15
回答 2查看 1.4K关注 0票数 1

我正在使用内置的PortRange方法编写一个类parse

代码语言:javascript
运行
复制
from pyparsing import Word, nums, Optional, Suppress

class PortRange(object):
    def __init__(self, start, end=None):
        self.start = start
        self.end = end if end is not None else self.start

    @staticmethod
    def parse(string):
        port = Word(nums)
        assignmentExpr = port.setResultsName('start') + Optional(Suppress("-") + port.setResultsName('end'))
        assignmentTokens = assignmentExpr.parseString(string)
        start = int(assignmentTokens.start)
        end = int(assignmentTokens.end)
        return PortRange(start=start, end=end)

PortRange对象具有startend属性,如果在构造函数中将end作为None给出,则假定它与开始相同。

PortRange也有一个字符串表示:如果startend相等,它只是一个数字,而如果它们不同,则用连字符分隔(例如,5-10)。我正在尝试编写一个使用parse正确解析两种情况的拟解析方法。为此,我编写了以下测试:

代码语言:javascript
运行
复制
import pytest

'''Tests'''
def test_parse_full_port_range():               # This passes
    port_range = PortRange.parse("5-10")
    assert port_range.start == 5
    assert port_range.end == 10

def test_parse_port_range_with_start_only():    # This fails
    port_range = PortRange.parse("5")
    assert port_range.start == 5
    assert port_range.end == 5


if __name__ == "__main__":
    pytest.main([__file__])

问题是第二个测试失败了,因为你最终会尝试去做。

代码语言:javascript
运行
复制
int('')

这导致了一个ValueError: invalid literal for int() with base 10: ''。在parse函数中,我希望end成为None,类似于如果我编写一个具有符号组名的正则表达式并使用groupdict()的话。

我怎样才能做到这一点?(我尝试将port重新定义为port = Word(nums).setParseAction(lambda x: int(x)),但由于lambda中有0个参数,这会导致TypeError )。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-21 17:13:13

assignementTokens似乎是一个字符串列表。我没有使用.start和.end属性,而是使用和-1作为开始和结束。在解析参数为"5“的情况下,start和end都设置为5(整数)。

代码语言:javascript
运行
复制
start = int(assignmentTokens[0])
end = int(assignmentTokens[-1])
票数 1
EN

Stack Overflow用户

发布于 2017-03-21 17:28:56

根据开始使用PyParsingParseResults.ParseResults类支持简单的基于列表的访问(在上面的答案中使用),以及对结果中命名字段的dict样式和对象属性风格的访问。如果未解析可选字段,则迪克样式的访问将返回一个KeyError。所以我使用字典的获取方法来确保Noneend的缺省值

代码语言:javascript
运行
复制
    start = int(assignmentTokens['start'])
    end = assignmentTokens.get('end', None)
    end = int(end) if end is not None else None

这也使得这两个测试都通过了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42933690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档