使用re模块帮助在python中构建正则表达式

时间:2009-02-05 03:51:28

标签: python regex parsing

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

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

我最初尝试将[^&lt;]添加到 - &gt;的前面使它忽略等价的实例但这只是让它根本不接受任何含义的实例。我们热烈欢迎任何可能的帮助:)

2 个答案:

答案 0 :(得分:4)

据我所知,你的正则表达式与以下内容相同:

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

正如您所写的那样,您还要在-><->字面之前匹配零个或多个空格字符。但是你没有捕获空间,所以指定“匹配是否存在空格”是没用的。另请注意,->不需要在这些正则表达式中进行转义。

我看到你有两个选择。第一个是确保IMPLICATIONEQUIVALENCE

的字符串不匹配
# This ought to work just fine.
IMPLICATION = re.compile("[^<]->")
EQUIVALENCE = re.compile("<->")

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

答案 1 :(得分:0)

我认为你可以简单地通过重新排序你的检查以匹配等价物,然后是影响来解决这个问题。但是,这似乎有效:

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