Замените все символы, кроме первого, в каждом слове строки строчными буквами.


У меня есть строка

text <- "This String IS a tESt. TRYING TO fINd a waY to do ThiS."

И я хотел бы использовать gsub в R, чтобы заменить все символы в каждом слове, которое не является первой буквой в нижнем регистре. Возможно ли это?

desired_output <- "This String Is a test. Trying To find a way to do This."
2 2

2 ответа:

Есть прекрасный способ сделать это. Мы можем сделать один вызов gsub в режиме Perl, воспользовавшись возможностью понизить регистр группы захвата.

text <- "This String IS a tESt. TRYING TO fINd a waY to do ThiS."
gsub("(?<=\\b.)(.*?)\\b", "\\L\\1", text, perl=TRUE)

[1] "This String Is a test. Trying To find a way to do This."

Демо-версия

Должен быть какой-то красивый способ сделать это, однако, один из способов состоит в том, чтобы разделить каждое слово и опустить все символы слова, кроме первого, а затем paste строку обратно.

paste0(sapply(strsplit(text, " ")[[1]], function(x) 
 paste0(substr(x, 1, 1),tolower(substr(x, 2, nchar(x))))), collapse = " ")

#[1] "This String Is a test. Trying To find a way to do This."

Подробное пошаговое объяснение :

strsplit(text, " ")[[1]]

#[1] "This"   "String" "IS"     "a"      "tESt."  "TRYING" "TO"     "fINd"  
# [9] "a"      "waY"    "to"     "do"     "ThiS." 

sapply(strsplit(text, " ")[[1]], function(x) 
         paste0(substr(x, 1, 1),tolower(substr(x, 2, nchar(x)))))

#   This   String       IS        a    tESt.   TRYING       TO     fINd 
#  "This" "String"     "Is"      "a"  "test." "Trying"     "To"   "find" 
#       a      waY       to       do    ThiS. 
#     "a"    "way"     "to"     "do"  "This." 


paste0(sapply(strsplit(text, " ")[[1]], function(x) 
  paste0(substr(x, 1, 1),tolower(substr(x, 2, nchar(x))))), collapse = " ")

#[1] "This String Is a test. Trying To find a way to do This."