Разделение строки Python, обработка одинарных кавычек - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь разбить строку на ",". Функция «split» отлично работает для следующего «example1», как и ожидалось.

example1 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc'"
example1.split(",")
Result: ['1', "'aaa'", '337.5', '17195', '.02', '0', '0', "'yes'", "'abc'"]

Но здесь у меня есть сценарий, где в одинарных кавычках есть запятые, на которые я не хочу делиться.

example2 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc, def, xyz'"
example2.split(",")
Result: ["1,'aaa',337.5,17195,.02,0,0,'yes','abc,", 'def,', "xyz'"]

Но я пытаюсь получить этот результат вместо:

['1', "'aaa'", '337.5', '17195', '.02', '0', '0', "'yes'", "'abc, def, xyz'"]

Как мне добиться этого с помощью функции разделения строк?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Предполагая, что вы хотите сохранить эти ' вокруг элементов ("'aaa'" вместо 'aaa', как в ожидаемом результате), вот как вы можете сделать это с помощью функции:

def spl(st, ch):
  res = []
  temp = []
  in_quote = False
  for x in st:
    if (x == "'"):
      in_quote = not in_quote

    if (not in_quote and x == ch):
      res.append("".join(temp))
      temp = []
    else:
      temp.append(x)

  res.append("".join(temp))
  return res




example2 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc, def, xyz'"

print(spl(example2, ','))

Вывод:

['1', "'aaa'", '337.5', '17195', '.02', '0', '0', "'yes'", "'abc, def, xyz'"]
0 голосов
/ 04 января 2019

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

Если ваша строка из источника, который вы не можете контролировать, добавление открывающих и закрывающих квадратных скобок дает допустимое значение list, поэтому вы можете использовать ast.literal_eval:

from ast import literal_eval

example2 = "1,'aaa',337.5,17195,.02,0,0,'yes','abc, def, xyz'"

res = literal_eval(f'[{example2}]')

# [1, 'aaa', 337.5, 17195, 0.02, 0, 0, 'yes', 'abc, def, xyz']

Это конвертирует числовые данные в целые числа / числа с плавающей запятой в зависимости от ситуации. Если вы хотите сохранить их как строки, согласно комментарию @JonClements, вы можете перейти к csv.reader:

import csv

res = next(csv.reader([example2], quotechar="'")) 

# ['1', 'aaa', '337.5', '17195', '.02', '0', '0', 'yes', 'abc, def, xyz']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...