Python: преобразование строки, представляющей массив строк, в список - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь преобразовать строку, представляющую массив строк, содержащий двойные кавычки, одинарные кавычки и запятые в элементах массива, в список python, когда этот массив передается конечной точке API через почтальона. (Я использую Python 3,6)

Пример: значение передано почтальону

"data":["bacsr "attd" and, fhhh'''","'gehh', uujf "hjjj"",",,,hhhhh,, ","1"]
  • element 1 = "bacsr" attd "и, fhhh '' '"
  • element 2 = "gehh", uujf "hjjj" "
  • element 3 =" ,,, hhhhh ,, "
  • element 4 =" 1 "

То, что я пытался и не удалось:

post_values = request.data['data']
post_values = ast.literal_eval(post_values)

Дает эту ошибку:

Во время обработки вышеупомянутого исключения (неверный синтаксис (, строка 1)), другое возникла исключительная ситуация:

Как преобразовать это в список из 4 элементов с соответствующими строковыми escape-символами?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Когда вы пишете: "bacsr "attd" and, fhhh'''", строка начинается с первой двойной кавычки и заканчивается sh со второй двойной кавычкой, attd находится вне строки. Чтобы использовать кавычки и двойные кавычки, вы должны поставить \ перед. Например:

"bacsr \"attd\" and, fhhh\'\'\'"

Без \, Python понимают, что ваша строка завершилась, и не знают, что такое attd.

PS. Извините, мой английский sh, я не бегло говорю.

0 голосов
/ 17 апреля 2020

надеюсь, это достаточно ясно.

import re

data = """\
"data":["bacsr "attd" and, fhhh'''","'gehh', uujf "hjjj"",",,,hhhhh,, ","1"]\
"""

data = data.replace('[','').replace(']','')

# regular expression to split out quoted or unquoted tokens in data string into individual groups
pat = re.compile(r'(?:")?([^"]*)(?:(?(1)"|))')
groups = [* filter(None, pat.split(data))]

l = ['']
for token in groups[2:]:
     if token == ',':
         l.append('')
     else:
         l[-1] += token

post_values = {groups[0] : l} # construct the result dict

print(post_values)

print()
for v in post_values['data']:
    print(v)

вывод:

{'data': ["bacsr attd and, fhhh'''", "'gehh', uujf hjjj", ',,,hhhhh,, ', '1']}

bacsr attd and, fhhh'''
'gehh', uujf hjjj
,,,hhhhh,,
1

примечание: элемент 2 отличается от того, что вы даете, но я не могу этого достичь.

...