2012-02-15 4 views
1

я в настоящее время этот код, который разбирает imdbAPI HTTP возвращается:Эффективное разбор строки в Python

text = 'unicode: {"Title":"The Fountain","Year":"2006","Rated":"R","Released":"22 Nov 2006","Genre":"Drama, Romance, Sci-Fi","Director":"Darren Aronofsky","Writer":"Darren Aronofsky, Darren Aronofsky","Actors":"Hugh Jackman, Rachel Weisz, Sean Patrick Thomas, Ellen Burstyn","Plot":"Spanning over one thousand years, and three parallel stories, The Fountain is a story of love, death, spirituality, and the fragility of our existence in this world.","Poster":"http://ia.media-imdb.com/images/M/MV5BMTU5OTczMTcxMV5BMl5BanBnXkFtZTcwNDg3[email protected]@._V1_SX320.jpg","Runtime":"1 hr 36 mins","Rating":"7.4","Votes":"100139","ID":"tt0414993","Response":"True"}' 

def stripData(tag="Title"): 
    tag_start = text.find(tag) 
    data_start = tag_start + len(tag)+3 
    data_end = text.find('"',data_start) 
    data = text[data_start:data_end] 
    return tag, data 

Я задаюсь вопросом: есть ли лучший способ сделать это мне не хватает?

ответ

5
>>> ast.literal_eval(text.split(' ', 1)[1]) 
{'Plot': 'Spanning over one thousand years, and three parallel stories, The Fountain is a story of love, death, spirituality, and the fragility of our existence in this world.', 'Votes': '100139', 'Rated': 'R', 'Response': 'True', 'Title': 'The Fountain', 'Poster': 'http://ia.media-imdb.com/images/M/[email protected]@._V1_SX320.jpg', 'Writer': 'Darren Aronofsky, Darren Aronofsky', 'ID': 'tt0414993', 'Director': 'Darren Aronofsky', 'Released': '22 Nov 2006', 'Actors': 'Hugh Jackman, Rachel Weisz, Sean Patrick Thomas, Ellen Burstyn', 'Year': '2006', 'Genre': 'Drama, Romance, Sci-Fi', 'Runtime': '1 hr 36 mins', 'Rating': '7.4'} 

>>> json.loads(text.split(' ', 1)[1]) 
{u'Plot': u'Spanning over one thousand years, and three parallel stories, The Fountain is a story of love, death, spirituality, and the fragility of our existence in this world.', u'Votes': u'100139', u'Rated': u'R', u'Response': u'True', u'Title': u'The Fountain', u'Poster': u'http://ia.media-imdb.com/images/M/MV5BMTU5OTczMTcxMV5BMl5BanBnXkFtZTcwNDg[email protected]@._V1_SX320.jpg', u'Writer': u'Darren Aronofsky, Darren Aronofsky', u'ID': u'tt0414993', u'Director': u'Darren Aronofsky', u'Released': u'22 Nov 2006', u'Actors': u'Hugh Jackman, Rachel Weisz, Sean Patrick Thomas, Ellen Burstyn', u'Year': u'2006', u'Genre': u'Drama, Romance, Sci-Fi', u'Runtime': u'1 hr 36 mins', u'Rating': u'7.4'} 
1

Вы можете попробовать лить все данные в dict после удаления всех ненужных головок и хвостов.

import re 

line = 'unicode: {"Title":"The Fountain","Year":"2006","Rated":"R","Released":"22 Nov 2006","Genre":"Drama, Romance, Sci-Fi","Director":"Darren Aronofsky","Writer":"Darren Aronofsky, Darren Aronofsky","Actors":"Hugh Jackman, Rachel Weisz, Sean Patrick Thomas, Ellen Burstyn","Plot":"Spanning over one thousand years, and three parallel stories, The Fountain is a story of love, death, spirituality, and the fragility of our existence in this world.","Poster":"http://ia.media-imdb.com/images/M/[email protected]@._V1_SX320.jpg","Runtime":"1 hr 36 mins","Rating":"7.4","Votes":"100139","ID":"tt0414993","Response":"True"}' 

def parser(text): 
    match = re.search(r'\{\"([^}]+)\"\}', text) 
    if match: 
     return dict(x.split('":"') for x in match.group(1).split('","')) 

newdict = parser(line) 

for k, v in newdict.items(): 
    print k, v 

Я использую регулярное выражение, но это так же легко замещено любым способом, который удаляет до { «и после того, как}» в извлеченной строке.

1

Кажется мне, что все работает слишком трудно ... если вы действительно

line = 'unicode: {"key1":"Value1", "key2","value2", etc...}' 

который выглядит как строки ...

то раздеть «Юникода:» выкл передняя часть строки

newline = line[9:] 

затем Eval результат непосредственно в Словаре

data_dict=eval(newline) 

вы получите доступ к данным по ключевому

print(data_dict['Title']) 

У вас есть идеальное форматирование, чтобы создать Python Dict и могут получить доступ к значениям непосредственно из этого контейнера.

+0

Это очень актуально и полезно, однако мне в основном интересно узнать об общем решении, в тех случаях, когда это невозможно сделать, как вы сказали. – talloaktrees

+0

Трудно представить «генмеральное» решение, поэтому такие специально структурированные данные :-), все эти решения зависят от формата данных ... –

Смежные вопросы