2016-04-15 3 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

Исправлено, спасибо. Если длина элемента, который я пытаюсь захватить, варьируется и может быть больше двух символов, так что выражение 'grab (..)' не всегда будет работать ... как я могу это приспособить? – nquestion

+0

Итак, если вы пытаетесь захватить более двух элементов, вы можете изменить свое регулярное выражение так: (. *) -> соответствует нулю или не имеет символов (. +) -> соответствует одному или нескольким символам (. {x}) -> соответствует x экземплярам символов. Если вы читаете «regex cheat sheet» в google, вы найдете полезные руководства по синтаксису регулярных выражений. – patrick

0

предположить, что существует только две цифры после захвата и только один «захватить хх» в одной строке

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

или принять на себя после захвата всегда есть по крайней мере одна цифра

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

Если длина элемента я пытаюсь захватить варьируется и может быть более двух символов так что высказывание 'grab (..)' не всегда будет работать ... как я могу это приспособить? – 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) 
Смежные вопросы