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。
我尝试从 "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。