首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个比循环和调用循环和调用另一个函数更好的方法

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

Stack Overflow用户
提问于 2018-07-31 12:03:42
回答 3查看 300关注 0票数 3

我有一个message (string),它由transactions组成,它由组成,后者由元素组成。

我有一个更好的方法来解析这样的消息,而不是循环和调用循环函数,调用另一个循环函数和调用另一个函数,因为我发现下面的内容很愚蠢:

代码语言:javascript
复制
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

有一个更好的way/design-pattern,我可以用它来处理吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-31 13:22:30

这种方法听起来肯定很密集,因为每一段文字都要经过多次。O(n^3)复杂性什么的。

相反,我会创建一个函数来检查输入一次,并在一次尝试中将其全部解析。要做到这一点,似乎有一个方便的myself解析模块可以使用(我自己从未使用过它,所以我不确定学习曲线、困难或优化)。否则,要手动完成此操作,您必须跟踪当前的“深度”(trans、group或元素),并确定是否在该深度关闭或打开trans/group/元素,同时跟踪开始表达式和结束表达式之间的数据。总之,不要找到所有的"trans",只要找到第一个开始的位置,在下一个组开始之前抓取任何唯一的数据,启动新的组,抓取唯一的数据直到元素开始,启动新的元素,抓取数据直到它关闭,查看是否有另一个元素或者组是否关闭等等。如果速度不是问题,你的方法是好的。如果它是(或将是)一个关注点,那么您需要在一次传递中解析它。

票数 0
EN

Stack Overflow用户

发布于 2018-07-31 12:14:57

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

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2018-07-31 12:43:48

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51612985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档