2016-04-15 3 views
0

Ich habe ein Objekt, das wie 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'}]Zugang Textstück in Python Objekt

ich aussieht möchte den Artikel innerhalb von text packen und mein Objekt formatiert, so dass es wie folgt aussieht: 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'}]

I

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

bekam aber den Fehler

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 

Antwort

0

Hallo sieht aus wie die Eingabe für Ihre Regex ist aus:

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

Woher kommt die "Linie"? Ist das eine Schnur? Möchtest du nicht nach "item ['text']" suchen? Beachten Sie auch, dass "re.search" keine Übereinstimmungen zurückgibt; verwenden z.B. re.findall().

+0

Fest, danke. Wenn die Länge des Gegenstandes, den ich zu greifen versuche, variiert und mehr als zwei Charaktere sein kann, so dass '' grab (..) '' nicht immer funktionieren würde ... wie könnte ich das unterbringen? – nquestion

+0

Wenn Sie also versuchen, mehr als zwei Elemente zu erfassen, können Sie Ihre Regex wie folgt ändern: (. *) -> entspricht 0 oder keiner Zeichen (. +) -> entspricht einem oder mehreren Zeichen (. {x}) -> passt x Instanzen von Zeichen. Wenn Sie "Regex-Spickzettel" googlen, finden Sie hilfreiche Anleitungen zur Regex-Syntax. – patrick

0

annimmt, dass es nur zwei Stellen nach dem Grab und nur ein ‚Grab xx‘ in einem String

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

oder übernehmen nach dem Grab gibt es immer mindestens eine Ziffer

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

Wenn die Länge des Elements I variiert zu greifen versuchen und kann mehr als zwei Zeichen lang sein so dass '' grab (..) 'nicht immer funktionieren würde ... wie könnte ich das akzeptieren? – nquestion

+0

@nquestion meine zweite ist die Zeichenfolge "grab xxx" x ist Ziffer und mindestens eine, es passt "Grab 23423", "Grab 9876" und so weiter. – galaxyan

1

Keine Notwendigkeit für Regex. Sie können unter

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

Dieses Programm wie tun, um Ihre block zu ändern, wie Sie in Ihrer Frage beschreiben:

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)