【问题标题】:How can I extract data from a string with no pattern?如何从没有模式的字符串中提取数据?
【发布时间】:2017-05-07 08:01:04
【问题描述】:

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

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

【问题讨论】:

  • 最重要的一步是准确地分析数据结构和你需要什么。例如,您说“数字”,但 81 1500.041 0.080 呢?得到任何数字都很容易,得到精确的数字需要更多的努力。
  • @cdarke,虽然我迟到了回复你的建议,但我编辑了这个问题。感谢您的评论。

标签: python extract


【解决方案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的链接。

【讨论】:

  • 如果您对解决方案感到满意,请接受它作为正确的解决方案。
  • 我是新来的。我该怎么做?
  • 在答案的左侧,您会看到一个带有两个箭头和一个灰色“OK”勾号的分数。当您点击灰色的勾号时,它会变成绿色 --- 表明您选择了这个答案作为正确答案。
  • 我现在知道如何接受答案了。我单击了位于答案左边距的复选标记。抱歉耽搁了这么久。
猜你喜欢
  • 2011-10-08
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2017-09-10
相关资源
最近更新 更多