5

具体的には、数値の範囲を検証する一般的な parseaction 関数を作成したいと考えています。関数に最小値と最大値を渡したい。これは可能ですか?

4

2 に答える 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 解析アクションを使用して、指定されたタイム スタンプが日時値の許容範囲内にあることを確認します。

(string->int 変換は rangeCheck に含めませんでしたが、これを 2 つの個別の解析アクションに分割したことに注意してください。そのため、rangeCheck を使用して、< と > をサポートする任意の型を検証できます。addParseAction と setParseAction を必ず呼び出してください。 、したがって、pyparsing は引き続き整数変換の解析アクションを最初に実行します。)

このような他の例は、pyparsing 自体で見つけることができます。これwithAttributeは、解析アクションを作成して、XML または HTML タグに特定の属性があり、オプションで特定の値があることを確認するメソッドです。

于 2011-05-09T12:43:41.787 に答える
0

Em、次のような意味ですか:

def parseaction(num, min = -100, max = 100):
    return min < num < max
于 2011-05-09T10:30:24.893 に答える