【问题标题】:Regex-EBNF conversion issue python正则表达式-EBNF转换问题python
【发布时间】:2015-01-21 02:21:10
【问题描述】:

我是 python 新手,正在尝试使用正则表达式和 EBNF。我不确定我的转换是否准确。我只需要再看看我的转化。

 EBNF                                      REGEX
 a{a} (convereted from regex)              a+  

 a{{ab} ya}  (convereted from regex)       a((xa)*ya)

 e{e}{bb|p[p] [p]d}c                       e+(bb|(p)*d)?c       

【问题讨论】:

  • 确切的问题是什么?第 1 列中的表达式是否等同于相应上下文中的第 2 列?
  • @NeronLeVelu..是..对于前两个..是与正则表达式等效的 ebnf,最后一个是与 ebnf 等效的正则表达式。更正会很有帮助。谢谢

标签: regex python-3.x expression ebnf


【解决方案1】:

虽然 EBNF 的功能很简单,但实际的符号可以以几种不同的形式出现。我将使用ISO/IEC 14977 : 1996(E) 的术语和符号(如果你用谷歌搜索它,它可以作为 PDF 获得)。

正则表达式a+ 是一个终端字符串(第 5.2 节),后跟一个重复序列(第 5.6 节)。 EBNF 形式为:

"a", {"a"}

正则表达式a((xa)*ya) 有点复杂。如果您首先查看a(ya),您有一个终端字符串,后跟一个分组序列(第 5.4 节)。它看起来像这样:

"a", ("y", "a")

子表达式(xa)* 本身就是一个包含两个终端字符串序列的重复序列。单独看起来像这样:

{"x", "a"}

可以将前两项结合起来得到完整表达式的EBNF形式:

"a", ({"x", "a"}, "y", "a")

最后一个表达式引入了两个额外的概念,特别是定义列表(第 5.10 节)和可选序列(第 5.5 节)。子表达式(bb|(p)*d) 包括一个定义列表。仅此子表达式的 EBNF 如下:

("b", "b" | {"p"}, "d")

当您包含可选量词时,将其扩展为子表达式 (bb|(p)*d)?,您将 EBNF 更新为以下内容:

[("b", "b" | {"p"}, "d")]

由于 Optional-sequence 也用作分组结构,您可以删除不必要的 start-group-symbol 和 end-group-symbol 以获得以下内容:

["b", "b" | {"p"}, "d"]

结合上面使用的步骤,可以得到完整的第三个正则表达式的EBNF形式:

"e", {"e"}, ["b", "b" | {"p"}, "d"], "c"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多