gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:10 25 4
gpt4 key购买 nike

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

我最初尝试在 -> 的前面添加 [^<] 以使其忽略等价实例,但这只会使其根本不接受任何蕴涵实例。热烈欢迎任何可能的帮助:)

最佳答案

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

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

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

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

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

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

关于python - 使用 re 模块帮助在 python 中构建正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/514475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com