比循环和调用循环并调用另一个函数的功能更好的方法

时间:2018-07-31 12:03:42

标签: python python-3.x algorithm oop design-patterns

我有一个消息(字符串),它由交易组成,该交易由组成,而元素由元素组成< / strong>。

循环并调用另一个函数循环并调用另一个函数相比,我有一种更好的方法来解析此类消息因为我发现以下内容很愚蠢:

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

是否可以使用一种更好的方法/ 设计模式

3 个答案:

答案 0 :(得分:2)

嗯,我想有几种可能性。您可能具有以下结构:

import re

GRAMMAR = (
    trans_pattern, (
        groups_pattern, (
            element_pattern, None
        )
    )
)

def parse_message(msg):
    parse_message_rec(msg, GRAMMAR)

def parse_message_rec(msg, grammar):
    if grammar is None:
        # Leaf element
        return
    pattern, next_grammar = grammar
    children = re.findall(pattern, msg)
    for child in children:
        parse_message_rec(child, next_grammar)

答案 1 :(得分:0)

该方法肯定听起来很费力,因为每一行文本都会被遍历多次。 O(n ^ 3)的复杂性。

相反,我将创建一个函数以一次遍历输入并将所有内容解析为一张照片。为此,听起来好像有一个可以使用的便捷pyparsing模块(我自己从未使用过,所以我不确定学习曲线,难度或优化)。否则,要手动执行此操作,您必须跟踪当前的“深度”(trans,group或element),并确定要在该深度关闭或打开trans / group / element,同时跟踪打开和关闭表达式之间的数据。简而言之,不要找到所有的“ trans”,只需找到第一个开始的位置,获取唯一的数据,直到下一组开始,开始新的组,获取唯一的数据,直到元素开始,开始新的元素,获取直到关闭,再查看是否还有其他元素或组是否关闭,等等,等等。虽然不那么简洁,但是肯定更快。如果不关心速度,则您的方法很好。如果它是(或将是)一个问题,那么您将希望一次分析它。

答案 2 :(得分:-2)

我为您订购了以下方法:将特殊格式转换为简单的XML(使用regexp或您喜欢的格式),然后您可以应用任何XML模式/方法/库来解析文本。