【问题标题】:using pyparsing to parse a list of regexes (literally)使用 pyparsing 解析正则表达式列表(字面意思)
【发布时间】:2011-05-14 16:45:04
【问题描述】:

我想解析一个正则表达式列表来计算每个在某个文本/字符串中找到匹配项的可能性...

例如。在长度为 1 的字符串中查找 '[AB]' 应该是 1/13 左右(仅考虑大写字母)。

是否有一个通用的正则表达式解析器,它返回各个位置/替代方案? 我正在考虑获取职位列表作为回报('[AB].A{2}' 将产生 '[['A','B'],'.',['AA']')

问题是用pyparsing解析正则表达式。 简单的正则表达式没有问题,但是当涉及到“替代”重复时,我迷失了:我发现很难解析像'((A[AB])|(AB))'这样的嵌套表达式。

有什么想法吗?

【问题讨论】:

  • 前段时间我写了一篇关于高尔夫的代码 (stackoverflow.com/questions/3523323/code-golf-regex-parser)。作为代码高尔夫,大多数答案都会有点难以破译。但是同样的问题也出现了,比我聪明得多的人会被找到方法。 :-)
  • 我回答了您的可能性问题,现在我看到您对正则表达式解析器的存在有第二个问题。必须至少有一个这样的解析器,即 Python 使用的解析器。如果您清楚地将您的问题标记为与 Python 内部有关,您可能会从 Python 专家那里得到答案。
  • 你看过 pyparsing wiki 上的这个例子吗? pyparsing.wikispaces.com/file/view/invRegex.py

标签: regex pyparsing


【解决方案1】:

你使用 ['A', 'B'] 来表示:或 A 或 B。那么你可以这样写:

'[{'A', ['A', 'B']}, {'A', 'B'}]'

在那里,您使用 [] 来表示“其中一个”,就像使用 {} 来表示“所有这些”

1/2 to '{'A', ['A', 'B']}'
   'A' => 1/1
   ['A', 'B'] => 1/2
   (1/1) * (1/2) = 1/2
   this (1/2) times the extern (1/2) = (1/4)
1/2 to '{'A', 'B'}' -> (1/26) to each.
Multiplify two times: 1/(26^2) and multiplify by the 1/2 = (1/(26^2))/2.

Now multiplify both:  (1/4) * ((1/(26^2))/2)

这是一个糟糕的解释......我会重试......

[] => Calc de probability: {probability of each term} / {num of terms}
{} => Calc de probability of each term and multiplify all

明白吗?

【讨论】:

  • 感谢分享这个,但是我的问题是如何解析复杂的正则表达式并获得正则表达式的各个位置,而不是如何对每个单独的位置进行评分...
【解决方案2】:

模拟而不是计算可能是要走的路。

设置一组具有代表性的文本字符串。 (语言学家将这样的集合称为语料库。)对于任何给定的正则表达式,找出它匹配的字符串数,然后除以语料库中的字符串总数。

您自己的示例将“[AB]”的可能性设为 1/13,就是基于这种思维方式,使用了单大写字母字符串的语料库。通过看到语料库的 26 个字符串中有两个匹配项,您得到 1/13。

创建一个更大的语料库:可能是所有字母数字字符串的集合到一定长度,或者所有 ASCII 字符串到一定长度,或者你选择的字典。思考什么语料库最适合您的目的是阐明“可能性”含义的好​​方法。

【讨论】:

  • 感谢这个有趣的方法!然而,我对解析复杂正则表达式的方法而不是评分感兴趣(这应该或多或少是微不足道的,因为我的字母集非常有限,并且它们的个体概率是已知的)......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2022-01-25
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多