【问题标题】:Help building a regular expression in python using the re module使用 re 模块帮助在 python 中构建正则表达式
【发布时间】:2009-02-05 03:51:27
【问题描述】:

我在 python 中编写了一个简单的命题逻辑公式解析器,它使用正则表达式 re 模块和 lex/yacc 模块进行词法分析/解析。最初我的代码可以选择蕴含为 ->,但添加逻辑等价 () 会导致编译表达式出现问题

IMPLICATION = re.compile('[\s]*\-\>[\s]*')
EQUIVALENCE = re.compile('[\s]*\<\-\>[\s]*')
...
elif self.IMPLICATION.search(formula[0].strip()):
...
elif self.EQUIVALENCE.search(formula[0].strip()):
...

我最初尝试将 [^ 的前面以使其忽略等价实例,但这只是使其根本不接受任何暗示实例。任何可能的帮助都将受到热烈欢迎:)

【问题讨论】:

  • 你为什么要用正则表达式而不是 yacc 语法?
  • 你能发布最小的独立示例来展示这种行为吗?创建此示例也可能对您有所帮助。

标签: python regex parsing


【解决方案1】:

据我所知,您的正则表达式等同于以下内容:

# This is bad, because IMPLICATION also will match every
# string that EQUIVALENCE matches
IMPLICATION = re.compile("->")
EQUIVALENCE = re.compile("<->")

正如您所写,您还在 -&gt; 和 &lt;-&gt; 文字之前匹配 零个或多个 个空白字符。但是您没有捕获空格,因此指定“匹配是否存在空格”是没有用的。另外请注意,- 和 &gt; 不需要在这些正则表达式中进行转义。

在我看来,你有两个选择。首先是确保IMPLICATION与EQUIVALENCE不匹配相同的字符串

# This ought to work just fine.
IMPLICATION = re.compile("[^<]->")
EQUIVALENCE = re.compile("<->")

另一种选择是使用maximal munch method;即,匹配所有正则表达式,并选择最长的匹配。这将通过赋予 EQUIVALENCE 比 IMPLICATION 更高的优先级来解决歧义。

【讨论】:

  • +1 用于减少杂物。但是,由于操作使用 elif,简单地颠倒两个测试的顺序应该做同样的伎俩(虽然隐含,而不是显式)
【解决方案2】:

我认为您可以简单地通过重新排序检查以首先匹配等价,然后是含义来解决这个问题。但是,这似乎可行:

>>> IMPLICATION = re.compile(r'\s*[^\<]\-\>\s*')
>>> EQUIVALENCE = re.compile(r'\s*\<\-\>\s*')

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多