具体来说,我想编写一个通用的 parseaction 函数来验证数字范围。我想将最小值和最大值传递给函数。这可能吗 ?
问问题
1285 次
2 回答
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")
印刷:
[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)
当然,更好的解析操作是验证整个日期 - 例如,当前解析器将接受“2000/2/31”。
这是给读者的一个练习:编写一个解析操作将解析的日期标记转换为日期时间,然后使用完全相同的 rangeCheck 解析操作来验证给定的时间戳是否在允许的日期时间值范围内。
(请注意,我没有在 rangeCheck 中包含 string->int 转换,而是将其分解为 2 个单独的解析操作,因此 rangeCheck 可用于验证支持 < 和 > 的任何类型。请务必调用 addParseAction 与 setParseAction ,这样pyparsing会继续先做整数转换解析动作。)
您可以在 pyparsing 本身中找到类似的其他示例 -withAttribute
是一种创建解析操作以验证 XML 或 HTML 标记是否具有特定属性的方法,可选地具有特定值。
于 2011-05-09T12:43:41.787 回答
0
嗯,你的意思是这样的:
def parseaction(num, min = -100, max = 100):
return min < num < max
于 2011-05-09T10:30:24.893 回答