преобразование словаря Python из строки? - PullRequest
0 голосов
/ 07 мая 2010

если у меня есть строка типа

"{ partner_name = test_partner}" OR " { partner_name : test_partner }

пример строки будет очень сложным с несколькими специальными символами, такими как =, [,], {,}

Какой будет лучший способ преобразовать его в объект Python - чтобы я мог обработать его

Я пробовал с помощью eval, но для строки требуется "" ", но как мы можем добавить этот специальный символ \ 'перед началом и окончанием каждого слова, я пробовал регулярное выражение re.findal (' \ w + '), но это не удается когда моя строка содержит символы «_» или подобные символы, поскольку она разделяет строку на «_»

Объектом этого вопроса являются потребности моего приложения, дружественный к пользователю язык ввода - и я подумал, что Json Dict будет хорош - но пользователю лениво ставить «» перед и после каждой строки ...

тогда я подумал о yaml, но это также сложно, если кто-нибудь может предложить более удобный ввод, который я использую в качестве объекта python - тогда, пожалуйста, помогите мне.

Ответы [ 5 ]

3 голосов
/ 07 мая 2010

Если YAML слишком сложен для ваших пользователей, вам следует подумать о том, чтобы предоставить им структурированную форму ввода и правильно отформатировать данные оттуда. YAML в значительной степени прост для написания, насколько это возможно, для определения структур, конечно, проще, чем синтаксис фигурных скобок.

1 голос
/ 07 мая 2010

Если это какие-то внешние данные, не используйте eval()!Если вы хотите разобрать его правильно, взгляните на некоторые библиотеки синтаксического анализа.Те, которые используют комбинаторы синтаксического анализа, довольно хороши - например, https://github.com/pyparsing/pyparsing Или, возможно, анализатор колышков: http://fdik.org/pyPEG/

1 голос
/ 07 мая 2010

Исправление ввода будет лучшим решением.

Но вы можете перепрыгнуть через серию обручей, пытаясь сделать ввод разборным на json. Это хрупко, так как ваш ввод не совсем json, а расходящиеся вводные данные могут легко его сломать (хотя все же имхо предпочтительнее, чем обычное использование eval).

>>> import json
>>> s = '{ partner_name = test_partner}'
>>> t = s.replace(' ', '') # strip whitespace
>>> t = t.replace('=', '":"')
>>> t = t.replace('{','{"')
>>> t = t.replace('}','"}')
>>> json.loads(t)
{u'partner_name': u'test_partner'}
0 голосов
/ 07 мая 2010

вы можете заменить или удалить любой нежелательный символ

>>> s
'{ partner_name = test_partner }'
>>> s = ''.join([c for c in s.replace('=', ':') if not c in '\ {}'])
>>> s
'partner_name:test_partner'

, а затем разбить строку на две части, чтобы создать диктовку

>>> dict([s.split(':')])
{'partner_name': 'test_partner'}

или обновление

>>> your_dict.update([s.split(':')])
0 голосов
/ 07 мая 2010
>>> import ast

>>> ast.literal_eval("{ 'partner_name' : 'test_partner' }")
{'partner_name': 'test_partner'}

скопировано с

EDIT

Вы можете использовать регулярные выражения

>>> import re
>>> m = re.match(r"(?P<partner_name>\w+) = (?P<test_partner>\w+)", "foo = bar")
>>> m.groupdict()
{'partner_name': 'foo', 'test_partner': 'bar'}
>>> 
...