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

2024-04-25 19:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

如何提取字符串中的117、0.049、207?你知道吗

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

Tags: 字符串airbadqualityoverallozoneparticulateppmaverage
1条回答
网友
1楼 · 发布于 2024-04-25 19:24:07

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

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的链接。你知道吗

相关问题 更多 >