如何从没有模式的字符串中提取数据?

时间:2017-05-07 08:01:04

标签: python extract

如何在字符串中提取117,0.049,207?

particulate 117㎍/㎥bad(81~150),ozone 0.049ppmaverage(0.041~0.080),overall air quality 207bad(151~250)

1 个答案:

答案 0 :(得分:1)

解析非结构化文本很麻烦:您可以使用正则表达式快速获得结果,如下所示:

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的链接。