这是你的正则表达式:
(\d+\s*(\*|\/|\+|\-)\s*)+(\d+\s*)
(\d+\s*(\*|\/|\+|\-)\s*)
将匹配表达式的第一部分:23 *
并存储*
在第二组中。
然后+
使其重复,但由于重复捕获组仅保留最后一个匹配项,因此它将丢弃23 *
and *
并改为匹配345 -
and -
在第二组中。
The +
在下一次重复时再次工作以丢弃最后一次捕获并改为捕获123+
在第一组中和+
在第二。
Next, +
无法再重复,所以它停止了,并且(\d+\s*)
开始匹配得到65
.
事实上,重复捕获组仅存储最后一个捕获是正则表达式的设计工作方式,并且在所有正则表达式引擎中都是如此。
进一步阐述:
重复匹配和重复捕获之间是有区别的。尝试:(\d)+
on 12345
你会看到只有5
将被捕获。就像那样,因为你的括号被分配了一个特定的组捕获。第一个组分配为组 1,如果组 1 有很多捕获,则只能保留 1 个,这是最后一个。不幸的是,这就是正则表达式的工作原理,根据文档 http://docs.python.org/2/library/re.html#match-objects:
如果一个组匹配多次,则只能访问最后一次匹配
如果你想得到你想要的输出,你可以使用re.findall
并与\d+|[+/*-]
:
import re
q = '23 * 345 - 123+65'
regexparse = r'\d+|[+/*-]'
elem = re.findall(regexparse, q)
print(elem)
#=> ['23', '*', '345', '-', '123', '+', '65']