【问题标题】:Python:Pattern detection and rule generationPython:模式检测和规则生成
【发布时间】:2012-09-14 13:25:08
【问题描述】:

我需要一个模式解释和规则生成系统。基本上它的工作原理是它应该解析文本并从中解释模式,并且基于这些解释,我需要输出一组规则。这是一个例子。假设我有一个看起来像的 HTTP 标头

GET https://website.com/api/1.0/download/8hqcdzt9oaq8llapjai1bpp2q27p14ah/2139379149 HTTP/1.1
Host: website.com
User-Agent: net.me.me/2.7.1;OS/iOS-5.0.1;Apple/iPad 2 (GSM)
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate

解析器会运行并输出

req-hdr-pattern: "^GET[ ].*/api/1\\.0/download/{STRING:auth_token}/{STRING:id}[].*website\\.com"

上述规则包含修改版本的正则表达式。每个变量,例如 STRING:auth_token 或 STRING:id 都将被提取。

为了解析文本(在这种情况下为标题),我必须告诉解析器它需要提取“下载”之后的任何内容。所以基本上有一组规则的定义,这个解析器将使用这些规则来解析文本并最终输出最终规则。

现在的问题是,python 中有没有这样的模块可用于模式匹配、检测、生成,可以帮助我解决这个问题?这有点像编译器的解析器部分。在深入尝试自己制作一个之前,我想问一下。有什么帮助吗?

【问题讨论】:

    标签: python regex pattern-matching yacc rule-engine


    【解决方案1】:

    我认为这个问题已经回答了:

    Parser generation

    Python parser Module tutorial

    我可以保证你想要的很容易使用 pyparsing 模块。

    【讨论】:

    • 为此使用 pyparsing 就像试图用火箭筒射蚊子一样。
    【解决方案2】:

    很抱歉,如果这不是您正在寻找的内容,但我有点赶时间。 Python 的 re 模块文档contains a section on writing a tokenizer.
    它的记录不足,但可能会帮助您使某些东西可行。
    当然比自己标记事物更容易,但可能无法提供您所追求的灵活性。

    【讨论】:

      【解决方案3】:

      你最好自己做。工作量不大。

      正如您所说,您必须将正则表达式定义为规则。然后,您的程序将找到匹配的正则表达式并将匹配转换为输出规则。

      ** 编辑 ** 我认为没有图书馆可以做到这一点。如果我理解正确,您想指定一组类似这样的规则:

      下载后提取

      这将输出如下文本:

      req-hdr-pattern: "^GET[ ].*/api/1\\.0/download/{STRING:auth_token}/{STRING:id}[].*website\\.com"
      

      为此,您必须创建一个解析器来解析您的规则。根据规则语法的复杂性,您可以使用 pyparsing、使用正则表达式或手动操作。我的经验法则是,如果你的语法是递归的(即像 html),那么使用 pyparsing 是有意义的,否则就不值得了。

      根据这些解析规则,您的程序必须创建新的正则表达式来匹配输入文本。基本上,您的程序会将规则转换为正则表达式。

      使用这些匹配的正则表达式从输入文本中提取数据。

      【讨论】:

      • 不,关键是我不应该写正则表达式。那时我的解决方案没有任何优势。我可以直接手动编写规则。
      • 我这样理解你正确吗?你想让程序解析一些文本,从中提取模式,然后将这些模式作为规则输出?
      • 是的,但是为了提取这些模式,我应该只给出确切的模式及其上下文。没有正则表达式。将此称为解析规则。解析规则看起来像“下载”后的提取。你明白我的意思吗?
      • 不,你上面提到的规则是成为解析器的输出。文本将与此不匹配。解析器应该解析文本然后输出这个规则。
      • 恐怕我不明白你想要什么。你说你应该“只给出确切的模式及其上下文”。你是什​​么意思?给予意味着一些投入。你能举一个输入模式的例子吗?
      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2017-01-07
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多