Я предполагаю, что это тестовая строка (т.е. в конце каждой строки есть невидимые \n
символы):
s = ''
s += 'MULTILINE1="This\nis a test"\n'
s += 'MULTILINE2= <<DOC\n'
s += 'This\n'
s += 'is a test\n'
s += 'DOC\n'
Лучшее, что я могу сделать, это обмануть с помощью NumPy:
import numpy as np
A = np.asarray([ss.rsplit('\n', 1) for ss in ('\n'+s).split('=')])
keys = A[:-1,1].tolist()
values = A[1:,0].tolist()
#optionally parse here-documents
di = 'DOC' #delimiting identifier
values = [v.strip().lstrip('<<%s\n'%di).rstrip('\n%s'%di) for v in values]
print('Keys: ', keys)
print('Values: ', values)
#if you want a dictionary:
d = dict( zip(keys, values) )
В результате:
Keys: ['MULTILINE1', 'MULTILINE2']
Values: ['"This\nis a test"', '"This\nis a test"']
Он работает, незаметно добавляя символ \n
в начало строки, затем разделяя всю строку на =
символов, а затем, наконец, использует rsplit
, чтобы сохранить все значения справа от =
, даже когда эти значения содержат несколько \n
символов. Печать массива A
проясняет ситуацию:
[['', 'MULTILINE1'],
['"This\nis a test"', 'MULTILINE2'],
[' <<DOC\nThis\nis a test\nDOC', '' ]]