Если вы продолжите использовать идентичный строковый формат, вы можете использовать сложное регулярное выражение для покрытия различных шаблонов.
Ниже приведено регулярное выражение для нескольких шаблонов, которые я ожидал. Дайте мне знать, если это решит вашу проблему. Если нет, просьба сообщить подробности о том, где мое решение не удалось:
Редактировать для объяснения
- Первая группа
(?=F\d+=\[).*?(\]){2,}(?=|,)
(?=F\d+=\[)
строка соответствия начинается с F, имеет одно или несколько чисел и имеет =[
после них
.*?(\]){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})