gpt4 book ai didi

python - 简单数学表达式的正则表达式

转载 作者:行者123 更新时间:2023-11-28 19:55:53 24 4
gpt4 key购买 nike

作为练习,我试图想出一个正则表达式来评估像这样的简单代数

q = '23 * 345 - 123+65'

我想从这里得到 '23'、'*'、'345'、'-'、'123'、'+'、'65'。

现在,我搜索了类似的问题,其他人已经解决了这个问题。但我真正想知道的是为什么我的解决方案不起作用。

这是我得到的最好的:

regexparse = '(\d+\s*(\*|\/|\+|\-)\s*)+(\d+\s*)'

解释

  • (\d+\s*(*|/|+|-)\s*)+
    • ( 一个或多个数字\d+ 后面可以跟空格\s* 然后必须跟符号之一 (*|/|+|-) 然后可以跟更多的空格\s* 和整个事情必须至少出现一次 )+
  • (\d+\s*)
    • 一个或多个数字,后面可以跟空格

但是,当我运行代码时

m = re.match(regexparse, q)
print m.group(0)
print m.group(1)
print m.group(2)
print m.group(3)

我明白了

23 * 345 - 123+65
123+
+
65

所以这就像第一个 block 匹配尽可能少的字符。为什么?

最佳答案

这是你的正则表达式:

(\d+\s*(\*|\/|\+|\-)\s*)+(\d+\s*)

(\d+\s*(\*|\/|\+|\-)\s*) 将匹配表达式的第一部分:23 * 并将 * 存储在第二组中。

然后 + 让它重复,但是因为重复的捕获组只保留他们的最后一个匹配,它会丢弃 23 * * 和而是匹配第二组中的 345 - -

+ 在下一次重复中再次工作以丢弃最后一次捕获,而是捕获第一组中的 123+ 和第二组中的 +第二。

接下来,+不能再重复了,所以停止,(\d+\s*)开始匹配得到65


重复捕获组仅存储最后一次捕获的事实是正则表达式设计的方式,并且在所有正则表达式引擎 AFAIK 中都是如此。


进一步阐述:

重复匹配和重复捕获是有区别的。在 12345 上尝试:(\d)+,您将看到只有 5 会被捕获。就像那样,因为您的 parent 被分配了一个特定的组捕获。第一组被分配为第 1 组,如果第 1 组有很多捕获,则只能保留 1 个,这是最后一个。不幸的是,这就是正则表达式的工作方式,as per the docs :

If a group matches multiple times, only the last match is accessible


如果你想得到你想要的输出,你可以使用 re.findall 并匹配 \d+|[+/*-]:

import re
q = '23 * 345 - 123+65'
regexparse = r'\d+|[+/*-]'
elem = re.findall(regexparse, q)
print(elem)
#=> ['23', '*', '345', '-', '123', '+', '65']

关于python - 简单数学表达式的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22730956/

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