我的目标是从这个字符串中提取数字(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>
除了解决这个问题外,我还想了解我使用的正则表达式模式的行为。