Как использовать только первую букву в каждом слове, оставляя при этом аббревиатуры? - PullRequest
0 голосов
/ 07 ноября 2019

Я пишу функцию для автоматизации очистки имен переменных для создания однородных имен переменных. Как правило, преобразование что-то вроде «Это пример» в «This.Is.An.Example». Обычно все это довольно просто, однако у меня возникают проблемы с аббревиатурами, содержащимися в именах переменных.

Примером этого является: «Clock in Time PST» в идеале должно стать «Clock.In.Time.PST»

Я рассматривал модификацию str_to_upper как функции, но у меня нет практических знаний о C, который, по-видимому, является основой того, на чем написано stringi.

Моя единственная следующая мысль - сделать что-то сусловная проверка, если строка не имеет пробелов или знаков пунктуации, затем вставьте пробел перед заглавной буквой, учитывая, что предыдущая буква строчная. Это моя единственная реальная мысль, как с этим справиться.

Example<-c("Easy Example Test", 
           "Medium..example TEst", 
           "HaRd exampleTEST", 
           "Truly HARd TestCase  PST")


#Step 1 - Removes all punctuation replacing with spaces
Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")

#Step 2 - This inserts a space wherever an uppercase letter is found with a preceding lowercase letter.
Example<-stringr::str_replace_all(Example,
 "([[:lower:]](?=[[:upper:]])|[[:upper:]](?=[[:upper:]][[:lower:]]))",
              "\\1 ")

#Step 3 - This replaces all consecutive spaces with a period
Example<-stringr::str_replace_all(names(df), "\\s{1,}", ".")





Current.Outcome<-c("Easy.Example.Test", 
                   "Medium.example.T.Est", 
                   "Ha.Rd.example.TEST", 
                   "Truly.HA.Rd.Test.Case.PST")


Ideal.Outcome<-c("Easy.Example.Test",
                 "Medium.Example.Test", 
                 "Hard.Example.Test", 
                 "Truly.Hard.Test.Case.PST")

1 Ответ

0 голосов
/ 09 ноября 2019

Я потратил некоторое время на выяснение лучших общих правил, чтобы найти решение для этого, используя правила регулярных выражений и замену строк. Решение не очень красивое, но оно работает в большинстве случаев, и более точный ответ не будет таким общим, как мне нужно. Ниже приведен еще один пример с моим рабочим ответом.

Я попытался применить разделение регулярного выражения на три отдельные команды str_replace_all (), однако результаты не были многообещающими, поэтому у нас есть это массивное регулярное выражение, выполняющее группирование и сопоставлениетребуется.

Example<-c("Easy Example Test", 
           "Medium..example TEst", 
           "Hard exampleTEST", 
           "Truly HARd TestCase  PST",
           "AnotherTESTof5FT2In",
           "AnotherTESTof5FTT2In",
           "ExampleOfCommonProblem")


  Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")

  Example<-stringr::str_replace_all(Example,
"(([[:lower:]]|[[:digit:]]){1}(?=[[:upper:]])|[[:upper:]]{2,}(?=([[:lower:]]|[[:digit:]]))|([[:lower:]]){1,}(?=[[:digit:]]))",
              "\\1 ")

  Example<-stringr::str_replace_all(Example, "\\s{1,}", ".")

  Example

Ниже приведен вывод консоли из приведенного выше кода, который не дает идеального ответа, но решает подавляющее большинство тестовых случаев.


>   Example
[1] "Easy.Example.Test"          "Medium.example.TE.st"      
[3] "Hard.example.TEST"          "Truly.HAR.d.Test.Case.PST" 
[5] "Another.TEST.of.5.FT.2.In"  "Another.TEST.of.5.FTT.2.In"
[7] "Example.Of.Common.Problem" 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...