Регулярное выражение для соответствия любому числу И любым символам в кавычках - PullRequest
1 голос
/ 06 мая 2020

Я столкнулся с этим странным форматированием csv, содержащим неэкранированный , символ:

   641,"Harstad/Narvik Airport, Evenes","Harstad/Narvik","Norway","EVE","ENEV",68.491302490234,16.678100585938,84,1,"E","Europe/Oslo","airport","OurAirports"  

Мне нужно вернуть такой список

[641,'Harstad/Narvik Airport Evenes', 'Harstad/Narvik', 'Norway', 'EVE', 'ENEV', 68.491302490234,16.678100585938,84,1, 'E', 'Europe/Oslo', 'airport', 'OurAirports']

У меня два регулярное выражение для соответствия части строки:

  • (\d+\.?\d*) совпадение чисел
  • (["'])(?:(?=(\\?))\2.)*?\1 соответствие любых символов между двумя одинарными или двойными кавычками

Является есть ли способ объединить совпадение в один результат?

1 Ответ

1 голос
/ 06 мая 2020

Вы можете использовать это регулярное выражение:

>>> s = '641,"Harstad/Narvik Airport, Evenes","Harstad/Narvik","Norway","EVE","ENEV",68.491302490234,16.678100585938,84,1,"E","Europe/Oslo","airport","OurAirports"'

>>> csvData = re.findall(r'"[^"\\]*(?:\\.[^"\\]*)*"|\d+(?:\.\d+)?', s)
>>> print csvData

['641', '"Harstad/Narvik Airport, Evenes"', '"Harstad/Narvik"', '"Norway"', '"EVE"', '"ENEV"', '68.491302490234', '16.678100585938', '84', '1', '"E"', '"Europe/Oslo"', '"airport"', '"OurAirports"']

Подробности RegEx:

  • "[^"\\]*(?:\\.[^"\\]*)*": сопоставить строку в кавычках, которая позволяет использовать экранированные кавычки или любые другие другой экранированный символ внутри, например, "foo\"bar", в один элемент
  • |: OR
  • \d+(?:\.\d+)?: соответствие целому или десятичному числу
...