вставлять запятую после каждой буквы, но пропускать кавычки

#python #string

#python #строка

Вопрос:

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

Примеры (Ввод -> Желаемый результат):

 "ABC" -> "A,B,C"
"AB'CD'E" -> "A,B,'CD',E"
'AB"CDG"EF' -> 'A,B,"CDG",E,F'
  

Я думал выполнить итерацию по строке и пропускать при обнаружении кавычек, но не уверен, как справиться с поиском индекса закрывающей цитаты.

 def convert(str):
    new_str = ''
    for c in str:
        if c not in ["'", '"']:
            new_str = new_str   c   ','
        else:
            ??
  

Любая помощь приветствуется!

Комментарии:

1. Нужно ли для этого просто обрабатывать одинарные кавычки?

2. @Nathan одинарный или двойной, я добавлю больше объяснений к своему сообщению. Спасибо!

Ответ №1:

Я бы попробовал использовать для этого регулярное выражение; не выписывайте синтаксический анализатор самостоятельно, если вам это действительно не нужно.

Я предполагаю, что ваша строка состоит только из алфавитных символов, что все группы, заключенные в кавычки, непустые (т. Е. между кавычками всегда есть какие-то символы), и что у вас нет никаких незакрытых кавычек.

Кажется, это работает:

 import re

s = "AB'CD'E"
splits = re.findall(""[A-z] "|'[A-z] '|[A-z]", s)
# ['A', 'B', "'CD'", 'E']
",".join(splits)
# "A,B,'CD',E"
  

Приведенное регулярное выражение ищет группы буквенных символов, заключенных в двойные или одинарные кавычки, или просто одиночные символы.

Ответ №2:

есть более простые способы сделать это в 2 строках кода, но я хотел дополнить логику вашей функции. Вам нужно проверить, где начинаются кавычки и где они заканчиваются, потому что в этом интервале не нужно выполнять никаких действий

 def convert(str):
    new_str =str[0]
    quote=False
    for c in str[1:]:
        if c in ["'", '"']:
            if quote==False:
                new_str=new_str ','
            quote=not quote
        if c not in ["'", '"'] and quote==False:
            new_str = new_str   ',' c
        else:
            new_str = new_str   c 
    return new_str
  

Комментарии:

1. Спасибо, Майд! Я не мог понять, как отслеживать положение кавычек, и это очень помогает!

2. добро пожаловать, рад, что это вам помогло. было бы здорово пометить мой ответ как принятый. Спасибо

Ответ №3:

Вы могли бы заменить подстроки в кавычках и символы без кавычек на re.sub при условии, что ваши строки правильно сформированы и кавычки сбалансированы:

 re.sub("('[^']*'|.)(?!$)", r'1,',  "AB'CD'E")
# A,B,'CD',E
  

Если вам нужно что-то более сложное, возможно, попробуйте разбирать символ за символом, как вы предложили. Отслеживайте текущее состояние — находится ли текущий символ в последовательности, заключенной в кавычки, или нет, — с помощью переменной.