2016-04-15 56 views
0

我有一個對象,看起來像 block = [{'id':'10001', 'date':'2016-01-11', 'text':'this is some text. grab 40'},{'id':'10002', 'date':'2014-03-12', 'text':'this is some more text. grab 60'}]訪問片Python對象中

我想內text搶項目,並重新格式化我的對象,因此它看起來像: block = [{'id':'10001', 'date':'2016-01-11', 'text':'this is some text. grab 40', 'grabbed': '40'},{'id':'10002', 'date':'2014-03-12', 'text':'this is some more text. grab 60', 'grabbed': '60'}]

我試過

for item in block: 
if "grab" in item['text']: 
     m=re.search('grab (..)',line) 
print m 

,但得到的錯誤

Traceback (most recent call last): File "<stdin>", line 3, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 146, in search 
return _compile(pattern, flags).search(string) TypeError: expected string or buffer 

回答

0

喜的樣子您的正則表達式的輸入關閉:

m=re.search('grab (..)',line) 

「行」從哪裏來?這是一個字符串?你不想搜索「item ['text']」? 還要注意「re.search」不會返回匹配項;使用例如re.findall()。

+0

修正了,謝謝。如果我試圖抓取的物品的長度不同,並且可能超過兩個字符,以至於說'抓(..)'不會總是有效......我怎麼能適應這個? – nquestion

+0

所以,如果你想捕捉兩個以上的項目,你可以修改你的正則表達式像這樣:(。*) - >匹配零個或無字符 - >匹配一個或多個字符 ((+)。 {x}) - >匹配x個字符的實例。 如果你谷歌「正則表達式備忘單」,你會發現有用的指南正則表達式的語法。 – patrick

0

假設只有2搶後位,並在一個字符串

for item in block: 
if "grab it" in item['text']: 
     m = re.findall('grab \d{2}',item['text'])[0] 
print m 

或只承擔一個「搶XX」搶後總有至少一位

for item in block: 
    if "grab it" in item['text']: 
      m = re.findall('grab \d+',item['text'])[0] 
    print m 
+0

如果我試圖抓住不同,可以是兩個以上的字符項的長度所以說'搶(..)'不會總是工作......我怎麼能適應呢? – nquestion

+0

@nquestion我的第二個匹配字符串「grab xxx」x是數字並且至少有一個匹配「grab 23423」,「grab 9876」等等。 – galaxyan

1

不需要正則表達式。你可以做如下

for b in block: 
    b["grabbed"] = b["text"].rstrip().rsplit(" ",1)[-1] 

In [205]: block 
Out[205]: 
[{'date': '2016-01-11', 
    'grabbed': '40', 
    'id': '10001', 
    'text': 'this is some text. grab 40'}, 
{'date': '2014-03-12', 
    'grabbed': '60', 
    'id': '10002', 
    'text': 'this is some more text. grab 60'}] 
0

這個程序將修改您的block當你在你的問題描述:

from pprint import pprint 
import re 

block = [{'id':'10001', 'date':'2016-01-11', 'text':'this is some text. grab 40'},{'id':'10002', 'date':'2014-03-12', 'text':'this is some more text. grab 60'}] 


pprint("Before:") 
pprint(block) 

for item in block: 
    grab = re.search(r"grab\s+(\d+)", item['text']) 
    if grab: 
     item['grabbed'] = grab.groups()[0] 

pprint("After:") 
pprint(block)