【发布时间】:2018-07-31 12:03:42
【问题描述】:
我有一个 message(字符串),它由 transactions 组成,它由 groups 组成,而elements。
我有比 循环和调用函数循环和调用另一个函数循环和调用另一个函数更好的方法来解析此类消息因为我发现以下内容很愚蠢:
class Parser:
def parse_msg(self, msg):
trans = re.findall(trans_pattern, msg)
for t in trans:
self.parse_trans(t)
def parse_trans(self, trans):
groups = re.findall(groups_pattern, trans)
for g in groups:
self.parse_group(g)
def parse_group(self, group):
elements = re.findall(element_pattern, group)
for e in elements:
self.parse_element(e)
def parse_element(self, e):
pass
有没有更好的方法/设计模式可以解决这个问题?
【问题讨论】:
-
如果它是一个指定的语法,你可以为它写一个解析器,例如使用pypi.org/project/pyparsing。
-
@deceze 不,这不是语法,而是使用一些预定义标准的基于业务的解析器。
-
什么?您正在尝试从字符串中获取信息,该字符串可能使用已定义的结构(否则,祝您好运从中获取任何信息),因此您可以在 pyparsing 之类的解析器中定义该结构(语法)。
-
@deceze 抱歉,我误解了您的评论,快速浏览 PyParsing 我认为这无济于事,但我肯定会更仔细地检查它。非常感谢。
-
还有另一种解析方式——类似于 xml 的 SAX 解析。您可以制作标记器,然后根据所遇到的标记调用函数的处理器。您需要将解析上下文保存在每个令牌函数可用的地方。如果你喜欢 FSM 的东西,它会更有效,但如果你应该完全解析消息,它的代码会更复杂。
标签: python python-3.x algorithm oop design-patterns