用pyparsing
构建一个
假设匹配的复杂匹配对象略有不同
事情取决于实例化标志。这是一个(简化的)示例:
class MyMatcher():
def __init__( self, special_flag = False):
self.special_flag = special_flag
a = pp.Word(pp.alphas)('A')
if self.special_flag:
b = pp.Word(pp.alphas)('B')
else:
b = pp.Word(pp.nums)('B')
c = pp.Word(pp.alphas)('C')
# d = ...
# e = ...
# ...
self.expr = (a + b | b ) + pp.Optional(c) # + ...
def parse(self, s):
return self.expr.parseString(s, parseAll=True)
a
,b
,c
,....是类变量,因此我可以引用它们就像在
expr
中一样,不必在它们前面加上实例引用
self
(类似于self.a
)。 expr
必须是实例变量,因为
MyMatcher
的实例化不同必须匹配不同的东西。
上面的示例有效:
mymTrue = MyMatcher(True)
mymFalse = MyMatcher(False)
print (mymTrue.parse("alpha aaaa alpha"))
print (mymFalse.parse("alpha 777 alpha"))
返回预期:
['alpha', 'aaaa', 'alpha']
['alpha', '777', 'alpha']
我担心的是:即使对于非常复杂的匹配器,它也可以工作吗?
(嵌套)
a
,b
,c
,d
等的...或用不同的措辞:是从类变量复制到实例的完整逻辑(深层)
对象
expr
,因此a
,b
和c
没关系在下一个
MyMatcher
对象创建时被覆盖?或者,如果这是一个问题,是否还有另一种方法来创造变化
结构短而漂亮的匹配器,例如
(a + b | b ) +pp.Optional(c)
? 最佳答案
变量a
,b
,c
,....不是类变量;它们是类变量。它们是__init__
方法中的局部变量。只要需要,对这些变量的引用将保持有效。 (请参见Python文档Scopes and Namespaces in Classes。)