如何在提取空格包围的数字(带有可选的小数部分)时避免嵌套分组?

时间:2018-05-07 13:03:55

标签: python regex

我的目标是从这个字符串中提取数字(int和float):

s = 'cs 0  scn /TT0 1 Tf 0.022 Tc -0.022 Tw 11.04 0 0 11.04 108 723.96 Tm (32)Tj 0 Tc 0 Tw 0.946 0 Td ( )Tj 0.021 Tc -0.01 Tw 5.728 0 Td [(I)-1(N)4(TE)3(R)15(M)-2(E)3(D)15(I)-1(A)4(TE)]Tj'
p = r'\s-?\d+(\.\d{1,3})?\s'

由于小数点后面跟着1-3位数字,\.\d{1,3}部分必须分组(即放在parantheses中),然后是?,因为它是re.findall(p, s)可选的。

然而,使用带有['', '', '.022', '.022', '.04', '', '', '', '', '.946', '.021', '.01', '.728'] 的正则表达式给出了这个:

p = r'\s(-?\d+(\.\d{1,3})?)\s'
re.findall(p, s)

# Result
>>> [('1', ''), ('0.022', '.022'), ('-0.022', '.022'), ('11.04', '.04'), ('0', ''), ('108', '')]

仅提取小数点右侧的部分。所以,我尝试将整个数字(包括可选的小数部分)放在parantheses中:

723.96

但它返回一个元组列表,其中每对包含整个匹配和小数部分。

此外,它无法与108(匹配后)之后的\b匹配。据我所知,两者都被空格包围,但是一个是匹配而另一个不是。

使用\s代替723.96匹配[(I)-1(N)4(TE)3(R)15(M)-2(E)3(D)15(I)-1(A)4(TE)],但它也匹配字符串['0', '1', '0.022', '-0.022', '11.04', '0', '0', '11.04', '108', '723.96', '0', '0', '0.946', '0', '0.021', '-0.01', '5.728', '0'] 部分中的数字。我不希望这些匹配。

为了防止我对目标一无所知,这就是所需的输出:

List<Object>

除了解决这个问题外,我还想了解我使用的正则表达式模式的行为。

0 个答案:

没有答案