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