Я также думаю, что для этой задачи xml гораздо более уместен, потому что уже есть много доступных инструментов, которые сделают разбор гораздо проще и менее подвержены ошибкам.
В любом случае, если вы решите использовать свойдизайн, я бы сделал что-то вроде этого:
import re
question_str = ("Would you like [to get]|[having]|g[to have] "
"responses to your questions sent "
"[up to]|g[to]|[on] you via email ?")
def option_to_dict(option_str):
if option_str.startswith('g'):
name = option_str.lstrip('g')
value = 1
else:
name = option_str
value = 0
name = name.strip('[]')
return {name: value}
regex = re.compile('g?\[[^]]+\](\|g?\[[^]]+\])*')
options = [[option_to_dict(option_str)
for option_str in match.group(0).split('|')]
for match in regex.finditer(question_str)]
print options
question = regex.sub('___', question_str)
print question
Пример вывода:
[[{'to get': 0}, {'having': 0}, {'to have': 1}], [{'up to': 0}, {'to': 1}, {'on': 0}]]
Would you like ___ responses to your questions sent ___ you via email ?
Примечание: Что касается дизайна, я думаю, что было бы лучше иметь метку, чтобы установить начало/ конец всего набора параметров (не один для отдельных параметров).