使用re-modu帮助在python中构建正则表达式

2024-04-23 23:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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()):
...

我最初尝试将[^<;]添加到-gt;的前面,以使其忽略等价实例,但这只是使它根本不接受任何隐含实例。欢迎任何可能的帮助:)


Tags: 模块实例ltgtselfresearchstrip
2条回答

我认为你可以简单地解决这个问题,首先对检查进行排序以匹配等价物,然后再匹配含义。然而,这似乎是有效的:

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

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

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

在编写本文时,还需要匹配-><->文本之前的零个或多个空白字符。但是您没有捕获空间,所以指定“匹配是否存在空间”是没有用的。另外,请注意,-和{}不需要在这些正则表达式中转义。在

我看你有两个选择。第一个是确保IMPLICATIONEQUIVALENCE不匹配相同的字符串

^{pr2}$

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

相关问题 更多 >