2011-11-03 58 views
0

我正在嘗試解析文件中的一些輸入文本,這些文本最初是從Twitter API抓取的。該文件是直接文本,在這種情況下我實際上並沒有抓住JSON。這是輸入文本的一個片段:如何讓我的RegEx捕獲冒號兩側的文本?

.....HootSuite</a>", "text": "For independent news reports on the crisis in #Japan, 
see @DemocracyNow News Archive: http://ow.ly/4ht9Q 
#nuclear #Fukushima #rdran #japon", "created_at": "Sat Mar 19..... 

基本上我需要抓住這個:

"text": "For independent news reports "on" the crisis in #Japan, see @DemocracyNow 
News Archive: http://ow.ly/4ht9Q #nuclear #Fukushima #rdran #japon" 

這裏有兩個我試圖獲得工作,但我遇到一些麻煩他們:

re.findall('"text":[^_]*',line) 
    re.findall('"text":[^:}]+',line) 

第一個將允許我抓住一切,直到後面的「創建」我想要的部分。第二個有點也適用,但是當文本中包含「:」時,它會一直持續到信息結束

任何人都有一些RegEx的經驗,可以指出我的方向是正確的嗎?

+4

如果你從Twitter的API抓住它,我們可以假設你抓住了JSON?爲什麼不只是拉JSON值? http://pypi.python.org/pypi/simplejson/ – switz

+0

這不是一個壞主意,好點。這裏是一個完整的數據行(儘可能多地粘貼) {「favorited」:false,「truncated」:false,「source」:「web」,「text」:「西漢姆推回馬刺隊在主場輸給熱刺將是重回歐冠賽場的嚴重挫折。「,」created_at「:」Sat Mar 19 14:19:19 +0000 2011「,」retweeted「:false,」class「 :「in_reply_to_status_id_str」:null,「id_str」:「49112718128594945」,「in_reply_to_screen_name」:null,「user」:{「follow_request_sent」:null,「profile_use_background_image」:true,「id」 :21619519,} – shenn

回答

1

如果您使用Twitter API,我想它會將JSON返回給您。 JSON支持任意嵌套,並且正則表達式永遠無法在每種場景中正確解析它。你會更好地使用JSON解析器。由於YAML是JSON的超集,因此您也可以使用YAML分析器。我會看看PyYaml。 (這是我知道他們很可能只是JSON解析器那裏太)

然後解析是會那麼容易,因爲:

import yaml 
results = yaml.load(twitter_response) 
print results["text"] # This would contain the string you're interested in. 
0
+0

不幸的是我沒有直接使用twitter API。信息是從給定的輸入文件中抓取的,它只是文本格式,所以simplejason在這種特殊情況下不會幫助我 – shenn

+0

它仍然會幫助你。只需使用文本文件作爲輸入。 simplejson是一個JSON解析器。輸入的文本文件仍然是JSON數據,不管它是否直接從Twitter中抓取。 – switz

0

JSON是一個很簡單的格式,你並不總是需要一個解析器,如果你試圖做一些小事。考慮下面的示例行:

>>> line = """{ "text" : "blah blah foo", "other" : "blah blah bar" }""" 

這裏有兩種方法可以做你想做的事。

用正則表達式:

>>> import re 
>>> m = re.search('"text"\ *:\ *"([^"]*)',line) 
>>> m.group() 
'"text" : "blah blah bar' 
>>> m.group(1) 
'blah blah bar' 

用的eval(JSON是一個很Python的格式):

>>> d = eval(line) 
>>> d['text'] 
'blah blah bar' 
相關問題