解析非结构化文本很麻烦:您可以使用正则表达式快速获得结果,如下所示:
input='particulate 117㎍/㎥bad(81~150),ozone 0.049ppmaverage(0.041~0.080),overall air quality 207bad(151~250)'
import re
input=re.sub(r'\(.*?\)','',input)
results=re.findall(r'[\d.]+',input)
print(results) # this prints ['117', '0.049', '207']
...但是要始终获得您想要的结果可能很困难。
让我们逐步讨论解决方案...
首先,您的输入包含括号内的数字——您不想要它们。所以,我们首先需要用正则表达式替换去掉括号:
input=re.sub(r'\(.*?\)','',input)
# now input is:
# particulate 117㎍/㎥bad,ozone 0.049ppmaverage,overall air quality 207bad
此替换搜索以左括号 '(' 开始并以右括号 ')' 结尾的子字符串,并将它们替换为空字符串。在编写这个表达式时,我们需要考虑一些细节:
- 括号在正则表达式中具有特殊含义。要在您的输入中引用实际的括号,我们需要在模式中对它们进行转义并写成 '(' 而不是 '('。
- 通常,模式 r'(.*)' 将采用我们输入中的第一个左括号和直到最后一个右括号的所有文本。这也太贪心了。我们在星号后添加问号以使表达式不贪婪。 * 不过,如果您输入的括号不匹配,您可能会得到错误的结果。
作为第二步,我们想从剩余的输入中挑选出数字。您的数字可能包含小数点,因此我们也需要在正则表达式中允许这一点。但是用正则表达式精确匹配数字是很棘手的。以下是我们的解决方案无法识别的有效数字(对于有效的一些定义):
-1.32 1.04e4 -3.14e-23
这是我们的模式提取为数字的字符串 --- 但您可能不想要它们:
10.24.12.123
所有这些都可以修复 --- 但模式会更复杂。而且你必须准确地决定你想得到什么,不想得到什么。
这是Python regular expression documentation的链接。