如何将值传递给pyparsing parseactions?

Fra*_*ery 5 python pyparsing

具体来说,我想编写一个通用的parseaction函数来验证数字的范围.我想将min&max传递给函数.这可能吗 ?

Pau*_*McG 6

使用闭包,如下所示:

def rangeCheck(minval=None, maxval=None):
    if minval is None and maxval is None:
        # this exception occurs not at parse time, but while defining the grammar
        raise ValueError("minval or maxval must be specified")

    def rangeCheckParseAction(string, loc, tokens):
        parsedval = tokens[0]
        if minval is not None:
            if maxval is not None:
                valid = minval <= parsedval <= maxval
            else:
                valid = minval <= parsedval
        else:
            if maxval is not None:
                valid = parsedval <= maxval

        if not valid:
            raise ParseException(string, loc, 
                    "value not in range (%s,%s)" % (minval, maxval))

    return rangeCheckParseAction

integer = Combine(Optional(oneOf("+ -")) + Word(nums))
integer.setParseAction(lambda t:int(t[0]))

month = integer.copy().addParseAction(rangeCheck(1,12))
day = integer.copy().addParseAction(rangeCheck(1,31))
year = integer.copy().addParseAction(rangeCheck(2000))

SLASH = Suppress('/')
dateExpr = year + SLASH + month + SLASH + day
print dateExpr.parseString("2011/5/8")
print dateExpr.parseString("1999/12/31")
Run Code Online (Sandbox Code Playgroud)

打印:

[2011, 5, 8]
Traceback (most recent call last):
  File "rangeCheck.py", line 21, in <module>
    print dateExpr.parseString("1999/12/31")
  File "c:\python26\lib\site-packages\pyparsing.py", line 1100, in parseString
    raise exc
pyparsing.ParseException: value not in range (2000,None) (at char 0), (line:1, col:1)
Run Code Online (Sandbox Code Playgroud)

当然,更好的解析操作是验证整个日期 - 例如,当前的解析器将接受'2000/2/31'.

以下是读者练习:编写解析操作以将解析后的日期标记转换为日期时间,然后使用完全相同的rangeCheck解析操作来验证给定时间戳是否在允许的日期时间值范围内.

(请注意,我没有在rangeCheck中包含string-> int转换,但将其分解为2个单独的解析操作,因此rangeCheck可用于验证支持<和>的任何类型.只需确保调用addParseAction与setParseAction ,以便pyparsing将继续首先执行整数转换解析操作.)

您可以在pyparsing中找到这样的其他示例 - withAttribute这样一种方法可以创建一个解析操作来验证XML或HTML标记是否具有特定属性,可选择具有特定值.


Zau*_*bov 0

嗯,你的意思是这样的吗:

def parseaction(num, min = -100, max = 100):
    return min < num < max
Run Code Online (Sandbox Code Playgroud)