Извлечь два или три слова и исключить дубликаты и сокращения - PullRequest
1 голос
/ 19 февраля 2020

У меня есть группа имен, написанных странным образом. Вот пример:

Sammy WatkinsS. Watkins
Buffalo BillsBUF
New England PatriotsNE
Tre'Quan SmithT. Smith
JuJu Smith-SchusterJ. Smith-Schuster

Моя цель состоит в том, чтобы очистить его, чтобы в качестве имени возвращались либо имя, либо фамилия, либо имена, либо просто имена команд. Вот что попробовали:

df$name <- sub("^(.*[a-z])[A-Z]", "\\1", "\\1", df$name)

Это то, что я получаю, вернувшись

Sammy WatkinsS. Watkins
Buffalo BillsBUF
New England PatriotsNE
Tre'Quan SmithT. Smith
JuJu Smith-SchusterJ. Smith-Schuster

Чтобы было ясно, цель будет иметь следующее:

Sammy Watkins
Buffalo Bills
New England Patriots
Tre'Quan Smith
JuJu Smith-Schuster

данные

df <- data.frame(name = c(
  "Sammy WatkinsS. Watkins",
  "Buffalo BillsBUF",
  "New England PatriotsNE",
  "Tre'Quan SmithT. Smith",
  "JuJu Smith-SchusterJ. Smith-Schuster"),
  stringsAsFactors = FALSE)

Ответы [ 4 ]

1 голос
/ 19 февраля 2020

Как насчет:

(?<=[a-z])[A-Z](?=[.\sA-Z]).*

Проверьте здесь . Без опыта в R Я не уверен, что это будет принято. Кроме того, могут быть более аккуратные шаблоны, так как я довольно новичок в RegEx.

Я также включил (возможно маловероятный) образец: Sammy J. WatkinsJ.S. Watkins

1 голос
/ 19 февраля 2020

Я предлагаю

df$name <- sub("\\B[A-Z]+(?:\\.\\s+\\S+)*$", "", df$name)

См. Демоверсию regex

Детали шаблона

  • \B - граница не из слов (перед буквой должна быть буква, di git или _)
  • [A-Z]+ - 1+ заглавные буквы ASCII (используйте \p{Lu} для сопоставления с заглавными буквами Unicode )
  • (?:\.\s+\S+)* - 0 или более последовательностей:
    • \. - точка
    • \s+ - 1+ пробелов
    • \S+ - 1+ без пробелов
  • $ - конец строки.
0 голосов
/ 20 февраля 2020

Другой способ:

sub("(.*?\\s.*?[a-z](?=[A-Z])).*", "\\1", df$name,  perl = TRUE)
#> [1] "Sammy Watkins"        "Buffalo Bills"        "New England Patriots"
#> [4] "Tre'Quan Smith"       "JuJu Smith-Schuster"

sub(".*?\\s.*?[a-z](?=[A-Z])", "", df$name, perl = TRUE)
#> [1] "S. Watkins"        "BUF"               "NE"               
#> [4] "T. Smith"          "J. Smith-Schuster"

Мы разделяемся между символами нижнего и верхнего регистра, но не раньше, чем мы видим пробел.

Вы также можете использовать unglue :

library(unglue)
unglue_unnest(df, name, "{name1=.*?\\s.*?[a-z]}{name2=[A-Z].*?}")
#>                  name1             name2
#> 1        Sammy Watkins        S. Watkins
#> 2        Buffalo Bills               BUF
#> 3 New England Patriots                NE
#> 4       Tre'Quan Smith          T. Smith
#> 5  JuJu Smith-Schuster J. Smith-Schuster
0 голосов
/ 19 февраля 2020

Два круга:

df$name <- gsub(".\\. .*", "", df$name)
df$name <- gsub("[A-Z]*$", "", df$name)

Первая строка удаляет все регистры формы «x. Фамилия», а вторая - все заглавные буквы в конце строки.

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