2017-05-07 54 views
-4

如何使用Python 3.4從以下字符串中的數據中提取數字,例如117,0.049,207?如何從字符串中提取特定數據(不包含任何模式)?

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

最重要的步驟是準確分析*數據結構以及您需要的數據結構。例如,你說「數字」,但是「81 150」和「0.041 0.080」呢?獲得任何數字很容易,要獲得精確的需要更多的努力。 – cdarke

回答

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'(。*)'將採用第一個開頭括號和所有文本到貪婪。我們在星號後添加問號以使表達式不貪婪。*但是,如果輸入中的括號不匹配,則您可能得到錯誤的結果。

至於第二步,我們想從剩餘的輸入挑選出的數字。您的號碼可能包含小數點,所以我們需要讓這個問題,以及在正則表達式,但匹配的號碼精確地使用正則表達式很棘手。下面是有效的數字(對於s有效青梅定義),我們的解決方案不拾:

-1.32 1.04e4 -3.14e-23 

這裏是一個字符串,我們的模式爲數字拿起---但你可能不希望他們:

10.24.12.123 

所有這可以被固定 - 但是模式會更復雜。而且你必須準確地決定你想要得到什麼以及你不想得到什麼。

這裏是鏈接到Python regular expression documentation

+0

非常感謝!有效!!! –

+0

如果您對解決方案感到滿意,請接受它作爲正確的解決方案。 –

+0

我是新來的。我怎麼做? –

相關問題