具体来说,我想编写一个通用的parseaction函数来验证数字的范围.我想通过一个小时和一个最大功能.这可能吗 ?
解决方法:
使用闭包,如下所示:
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标记是否具有特定属性,可选择具有特定值.
标签:python,pyparsing 来源: https://codeday.me/bug/20190518/1128219.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。