Регулярное выражение для правки строки
Есть CSV в котором битые строки. В нем три проблемы.
- В начале строки вместо двух кавычек, одна.
- В конце вместо 2х кавычек, три
- В первом поле вместо "","" -> ,""
import re
item = '"last_name,""first_name"",""middle_name"",""birthday"",""passport_series"",""passport_number"",""mfo_name"",""created_at"",""status"""'
regex = re.compile('[^"],""')
item = item.replace('"""', '""')
tmp = regex.sub('"",""', item)
Сейчас в 'last_name' съедается 'e' Помогите с регулярным выражением которое не будет съедать символ перед ,"" для первого столбца.
Ответы (2 шт):
Намного проще сначала убрать вообще все кавычки, а потом поставить их там, где нужно:
res = ['""{}""'.format(x.replace('"','')) for x in item.split(',')]
print(res)
получим список:
['""last_name""', '""first_name""', '""middle_name""', '""birthday""', '""passport_series""', '""passport_number""', '""mfo_name""', '""created_at""', '""status""']
Замените выражение на
(?<!"),""
Шаблон (?<!") является блоком предварительного просмотра назад, который проверяет, есть сразу перед текущей позицией в строке символ двойно кавычки, и если есть, отменяет совпадение, или же, в противном случае, разрешает поиск совпадений последующих шаблонов в выражении.
Вместо item.replace('"""', '""') можно просто убрать все кавычки в начале и конце строки с помощью .strip('"'), а затем добавить их после замены с регулярным выражением.
import re
item = '"last_name,""first_name"",""middle_name"",""birthday"",""passport_series"",""passport_number"",""mfo_name"",""created_at"",""status"""'
regex = re.compile(r'(?<!"),""')
tmp = '""' + regex.sub('"",""', item.strip('"')) + '""'
# print(tmp) => ""last_name"",""first_name"",""middle_name"",""birthday"",""passport_series"",""passport_number"",""mfo_name"",""created_at"",""status""