Я относительно новичок в регулярных выражениях, так что терпите меня, если вопрос тривиален. Я хотел бы поставить запятую между каждой буквой строки, используя регулярное выражение, например:
x <- "ABCD"
я хочу получить
"A,B,C,D"
Было бы неплохо, если бы я мог сделать это, используя gsub
, sub
или связанный с вектором строк произвольного количества символов.
Я попытался
> sub("(\\w)", "\\1,", x)
[1] "A,BCD"
> gsub("(\\w)", "\\1,", x)
[1] "A,B,C,D,"
> gsub("(\\w)(\\w{1})$", "\\1,\\2", x)
[1] "ABC,D"
@Tom Я изменил «двоеточие» на «запятую» в своем редактировании.
Вы можете использовать
> gsub("(.)(?=.)", "\\1,", x, perl=TRUE)
[1] "A,B,C,D"
Регулярное выражение (.)(?=.)
соответствует любому символу, захватывающему его в группу 1 (с (.)
), за которым должен следовать любой одиночный символ ((?=.)
) — это положительный просмотр вперед, требующий символа непосредственно справа от текущего местоположения).
Варианты решения:
> gsub("(.)(?!$)", "\\1,", x, perl=TRUE)
## Or with stringr:
## stringr::str_replace_all(x, "(.)(?!$)", "\\1,")
[1] "A,B,C,D"
Здесь (?!$)
терпит неудачу, если есть позиция конца строки.
Смотрите демо R онлайн:
x <- "ABCD"
gsub("(.)(?=.)", "\\1,", x, perl=TRUE)
# => [1] "A,B,C,D"
gsub("(.)(?!$)", "\\1,", x, perl=TRUE)
# => [1] "A,B,C,D"
stringr::str_replace_all(x, "(.)(?!$)", "\\1,")
# => [1] "A,B,C,D"
ах. Спасибо! Я думал, что это что-то о просмотре вперед, но мне не удалось заставить его работать. Спасибо также за объяснение, это действительно полезно.
Дружественный ответ без регулярных выражений:
paste(strsplit(x, "")[[1]], collapse = ",")
#[1] "A,B,C,D"
Спасибо! Я тоже придумал это, но мне очень нужно наточить свой regex
Пытаться:
x <- 'ABCD'
gsub('\\B', ',', x, perl = T)
Отпечатки:
[1] "A,B,C,D"
Возможно, неправильно прочитал запрос; OP хочет добавить запятую только между буквами. Поэтому попробуйте:
gsub('(\\p{L})(?=\\p{L})', '\\1,', x, perl = T)
(\p{L})
- Сопоставьте любую букву любого языка в 1-й группе;(?=\p{L})
- Положительный прогноз для соответствия, как указано выше.Мы можем использовать обратную ссылку на эту группу захвата в замене.
а, правильно: ‘\B’ соответствует пустой строке, если она не находится на краю слова; еще один полезный символ.
@ Том, у меня есть дополнительный вопрос. Вы хотите добавить запятую между всеми символами? Включая саму запятую? Например, каков ваш желаемый результат, скажем, Hello,12&4
. Хотя \B
работает для текущих выборочных данных, это может привести к неожиданным результатам.
хехе, приятно. Но нет, не в этом случае
@ Том, так что \B
может быть не тем, что вы ищете, поскольку оно также будет соответствовать позициям, которые находятся не только между буквами. Сначала я неправильно истолковал ваш вопрос, но отредактировал свой ответ, включив в него способ сопоставления положения только между буквами.
ok \p{xx}’ и ‘\P{xx}’, которые соответствуют символам со свойством ‘xx’ и без него соответственно, тогда как L
означает «буква»?!
@ Том, да. См. этот список для ссылок.
Хороший и имхо лучший ответ, особенно вторая часть.
Другой вариант — использовать положительный взгляд назад и взгляд вперед, чтобы утверждать, что есть предшествующий и последующий символы:
library(stringr)
str_replace_all(x, "(?<=.)(?=.)", ",")
[1] "A,B,C,D"
trimws(gsub("", ",", x),,",")