python 正则表达式模式以最小的方式抓取数字

python regex pattern grabs digits in a minimal way

我尝试从 "at (17.08)" 这样的字符串中获取英里数和链式整数值。输入数据的伪十进制形式是数据管理员的选择。首先,我在这个字符串“17.08”上尝试了以下模式:

"((\d+)\.(\d\d))"

这表现正确:

group(0) is "17.08"
group(1) is "17.08"
group(2) is "17"
group(3) is "08"

但现在对于 "at (17.08) is a" 变体:我希望能够使用以下模式用格式正确的位置替换 "decimal" 表示法:

".*\(?((\d+)\.(\d\d))\)?.*"

当使用 re.match 查询时,我得到以下匹配组:

group(0) is "(17.08)", OK.
group(1) is "7.08", where is the 1 going ?
group(2) is "7", where is the 1 going ?
group(3) is "08", still OK.

我做错了什么?为什么 "re" 会这样?我知道这一定与 "greedy"/"non-greedy" 主题有关,但是如何呢?

原因是前缀的 .*\(? 部分吸收了输入中的 1,因为左括号是可选的,而 .* 是贪心的。我解决问题的方法是改用以下正则表达式(注意第一个 * 之后的 space):

".* \(?((\d+)\.(\d\d))\)?.*"

假设您总是在左括号(如果存在)或数字之前有一个 space。