【问题标题】:Pyparsing ignore exceptPyparsing忽略除了
【发布时间】:2016-01-01 20:32:08
【问题描述】:

我有一个文件,行中有pythonStyleComments,例如:

def foo(): # declare
    # Simple function
    a = 0 # TODO: add random
    return a

那么,我想将 .ignore(pythonStyleComments) 添加到 pyparsing,但想处理任何元数据(例如 TODO: )。我知道所有的元词,所以我怎么能排除这个 cmets 忽略?

也许将注释声明为 '#' + Regex(),其中 Regex 将排除元词?还是pyparsing有更优雅的方法?

【问题讨论】:

    标签: python regex comments pyparsing


    【解决方案1】:

    我建议通过多次传递来处理这个问题。首先,为您的 TODO cmets 定义一个模式,并使用 scanString 来定位所有这些实例。然后使用您的解析器运行第二遍,并将 TODO 与您定位的元素的位置相匹配。

    或者(这完全未经测试),尝试将解析操作附加到 pythonStyleComment,然后像往常一样执行并调用 parser.ignore(pythonStyleComment)。如果一个匹配,并且它与您的 TODO 格式匹配,则将有关该评论及其位置的内容保存到一边。 (我不肯定忽略的表达式会运行它们的解析操作,因此您可能必须使用 2-pass 方法。)

    【讨论】:

      【解决方案2】:

      我刚刚声明了comment = Literal('#').suppress() + Optional(restOfLine)

      然后将其作为 Optional(comment) 添加到每个语句的末尾,它可能出现的位置。 然后添加

      def commentHandler(t):
          result = []
          if "fixed" in t[0]:
              result.append("fixed")
          if "TODO: " in t[0]:
              try:
                  message = t[0].split("TODO: ")[1].strip()
                  result.append(message)
              except Exception as e:
                  result.append(t[0])
          return result
      
      comment.setParseAction(commentHandler)
      

      所以它非常适合我。

      【讨论】:

        猜你喜欢
        • 2022-01-12
        • 2021-09-29
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        • 2016-11-02
        • 2020-12-20
        相关资源
        最近更新 更多