2016-04-15 52 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)