Удалить запятую внутри кавычек

У меня есть строки вроде:

string <- "1, 2, \"something, else\""

Я хочу использовать tidyr::separate_rows() с sep==",", но запятая внутри части строки в кавычках сбивает меня с толку. Я бы хотел убрать запятую между something и else (но только эту запятую).

Вот более сложный пример игрушки:

string <- c("1, 2, \"something, else\"", "3, 5, \"more, more, more\"", "6, \"commas, are fun\", \"no, they are not\"")

string
#[1] "1, 2, \"something, else\""                   
#[2] "3, 5, \"more, more, more\""                  
#[3] "6, \"commas, are fun\", \"no, they are not\""

Я хочу избавиться от всех запятых внутри встроенных цитат. Желаемый результат:

[1] "1, 2, \"something else\""                  
[2] "3, 5, \"more more more\""                  
[3] "6, \"commas are fun\", \"no they are not\""
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
7
0
322
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Лучшее, что я могу сделать:

stringr::str_replace_all(string,"(?<=\\\".{1,15})(,)(?=.+?\\\")","")

это: (?<= ) = смотреть назад

\\\" = \ и "

.{1,15} = от 1 до 15 символов (см. примечание)

(,) = запятая - это то, на что мы хотим ориентироваться

(?= ) смотреть вперед

.+? = один или несколько символов, но как можно меньше

\\\" = \ и "

примечание: взгляд назад не может быть неограниченным, поэтому мы не можем использовать здесь .+?. Отрегулируйте максимум 15 для вашего набора данных.

редактировать: решение Андре Вильдберга лучше - я тупо забыл, что "", определяющий строку, не является частью строки, поэтому сделал ее намного сложнее, чем нужно.

Ответ принят как подходящий

Вы можете определить небольшую функцию для замены.

library(stringr)

rmcom <- function(x) gsub(",", "", x)

str_replace_all(string, "(\"[[:alnum:]]+,[ [:alnum:],]*\")", rmcom)
[1] "1, 2, \"something else\""
[2] "3, 5, \"more more more\""
[3] "6, \"commas are fun\", \"no they are not\""

В качестве альтернативы мы могли бы инвертировать проблему (и сохранить запятую, что может быть полезно) и использовать регулярное выражение напрямую с separate_rows, чтобы разделить только запятую НЕ внутри кавычек:

library(tidyr)

df |>
  separate_rows(stringcol, sep = '(?!\\B"[^\"]*), (?![^"]*\"\\B)')

Выражение регулярного выражения из: Регулярное выражение найти запятую не внутри кавычек

В качестве альтернативы: Регулярное выражение для выбора символов вне пары кавычек

Вывод:

# A tibble: 9 × 1
  stringcol             
  <chr>                 
1 "1"                   
2 "2"                   
3 "\"something, else\"" 
4 "3"                   
5 "5"                   
6 "\"more, more, more\""
7 "6"                   
8 "\"commas, are fun\"" 
9 "\"no, they are not\""

Данные:

library(tibble)

df <- tibble(stringcol = string)

Другие вопросы по теме