Преобразовать в правильный регистр, за исключением случаев, когда это TLA в R

#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")