Преобразовать строку в Dict в Python - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь преобразовать приведенный ниже тип строки в словарь в Python.

'F1=Value1,F2=Value2,F3=[[F4=Value4,F5=Value5]],F6=Value6'

Я хотел бы сделать словарь следующим образом:

{
    'F1': 'Value1', 
    'F2': 'Value2',
    'F3': '[[F4=Value4,F5=Value5]]',
    'F6': 'Value6'
}

1 Ответ

0 голосов
/ 13 ноября 2018

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

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

Редактировать для объяснения

  1. Первая группа (?=F\d+=\[).*?(\]){2,}(?=|,)
    • (?=F\d+=\[) строка соответствия начинается с F, имеет одно или несколько чисел и имеет =[ после них
    • .*?(\]){2,} соответствует строке как можно меньше, и она имеет 2 или более ] в конце
    • (?=|,) конец строки , или ничего
  2. Вторая группа F\d.[^,]+
    • после сопоставления с первой группой легко найти строку типа F6=Value6. потому что первая группа имеет приоритет над второй группой, поэтому вторая группа может соответствовать только оставшимся строкам.

код

string = "F1=Value1,F2=Value2,F3=[[F4=Value4,F5=Value5]],F6=Value6,F7=[[[BC],[AC]]]"
import re
resultset = [ele[0] if ele[0] else ele[-1] for ele in re.findall(r"((?=F\d+=\[).*?(\]){2,}(?=|,))|(F\d.[^,]+)",string)]
print({x[:x.find("=")]:x[x.find("=")+1:] for x in resultset})

выход

{'F6': 'Value6', 'F2': 'Value2', 'F3': '[[F4=Value4,F5=Value5]]', 'F1': 'Value1', 'F7': '[[[BC],[AC]]]'}

Редактировать: потому что прежнее регулярное выражение не работает, когда строка F1=Value1,F2=Value2,F8=[iD=10,ig=12S],F3=[[F4=Value4,F5=Value5]],F6=Value6,F9=[iD=10,ig=12S],F7=[[[BC],[AC]]]

Я изменил регулярное выражение на ((?=F\d+=\[).*?(\])+(?= |,F))|(F\d.[^,]+). И нам нужен один трюк. добавить одну пробел после строки .

string = "F1=Value1,F2=Value2,F8=[iD=10,ig=12S],F3=[[F4=Value4,F5=Value5]],F6=Value6,F9=[iD=10,ig=12S],F7=[[[BC],[AC]]]"
import re
resultset = [ele[0] if ele[0] else ele[-1] for ele in re.findall(r"((?=F\d+=\[).*?(\])+(?= |,F))|(F\d.[^,]+)",string+" ")]
print({x[:x.find("=")]:x[x.find("=")+1:] for x in resultset})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...