У меня есть строки вроде:
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\""
Лучшее, что я могу сделать:
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)