#r #regex
#r #регулярное выражение
Вопрос:
У МЕНЯ ЕСТЬ РЯД СИМВОЛЬНЫХ ЗНАЧЕНИЙ, КОТОРЫЕ ВЫГЛЯДЯТ СЛЕДУЮЩИМ ОБРАЗОМ. Я хочу, чтобы они выглядели вот так.
Однако у меня есть набор слов, которые при точном подборе должны оставаться такими, какие они есть. В этом списке были бы такие вещи, как ABC.
Для ввода
ШЕСТЬ ШЕСТЬДЕСЯТ ИСПЫТУЕМЫХ
с исключением «ШЕСТЕРКИ»
Желаемый результат был бы «ШЕСТЬ шестьдесят испытуемых».
Мой текущий код таков:
x <- gsub(paste0("(", paste(exclusions, collapse = "|"), "|\w)(\w*)"), "\U\1\L\2", x, perl = T)
Комментарии:
1.Я не знаю R, но замена
b(?!SIXb)(w)(w*)b
наU1L2
должна работать для данного примера. ДЕМОНСТРАЦИЯ. Затем вместо «ШЕСТЬ» вы можете добавить список исключенных слов, соединенных символом канала. Редактировать:b(SIXb|w)(w*)b
также будет работать (что, похоже, и было тем, что вы пытались сделать).
Ответ №1:
Вот один из подходов:
x <- "SIX SIXTY TEST SUBJECT"
output <- gsub("(?<=.)\b(\S)(\S*)", "\U\1\L\2", x, perl=TRUE)
output
[1] "SIX Sixty Test Subject"
Вот объяснение используемого регулярного выражения:
(?<=.) assert that some text precedes (ignore the first uppercase word)
\b word boundary
(\S) match and capture the first character
(\S*) match and capture the remaining characters
Затем мы заменяем первую захваченную букву в верхнем регистре, за которой следуют остальные символы в нижнем регистре. Обратите внимание, что положительный прогноз (?<=.)
избавит самое первое слово от замены.
Редактировать:
Если вместо этого вы хотите сохранить буквальное слово SIX
, используйте эту версию:
x <- "SIX SIXTY TEST SUBJECT"
output <- gsub("\b(?!SIX\b)(\S)(\S*)\b", "\U\1\L\2", x, perl=TRUE)
Комментарии:
1. «избавьте самое первое слово от замены» , если я полностью не понял проблему, похоже, это не то, что нужно OP. Цитируя OP, «Однако у меня есть набор слов, которые при точном совпадении должны оставаться такими, какие они есть» .
2. @41686d6564 Достаточно справедливо, я добавил ответ, чтобы охватить ваше понимание.
3. Да, это было для набора исключений (ограничено всего ШЕСТЬЮ для иллюстрации), но я думаю, что я могу достаточно легко расширить это до списка исключений
Ответ №2:
Используйте to_any_case
функцию из пакета snakecase, передавая свои исключения в abbreviations
аргумент.
library(snakecase)
x <- "SIX SIXTY TEST SUBJECT"
exclusions <- c("SIX")
to_any_case(x, case = "title", abbreviations = exclusions)
#> [1] "SIX Sixty Test Subject"
Комментарии:
1. Я получаю сообщение об ошибке при попытке установить пакет snakecase. Ошибка в install.packages: объект ‘snakecase’ не найден
2. Вы ввели
install.packages(snakecase)
, но нужноinstall.packages("snakecase")