Используйте Stringr для выбора всех средних слов, пропуская первое и последнее слово - PullRequest
1 голос
/ 10 апреля 2020

У меня есть список полных имен, которые я пытаюсь разделить на имя, фамилию, а затем все отчества.

name <- c('James Freddy Peter','James Peter','James Freddy Freddy Peter', 'James Freddy Samuel Freddy Peter')

Мне удалось выбрать имя:

firstName <- gsub("([A-Za-z]+).*", "\\1", name)

И фамилию

lastName <- gsub("^.* ([[:alnum:]]+)$", '\\1', name)

Но я застрял на том, как выбрать все остальное. Все примеры, которые я видел, использовали какой-то другой разделитель для разделения (то есть между "-" и "-"). Я также знаю, что кажется плохой практикой выбирать все, кроме заданного шаблона. Это также кажется избыточным до go, разделить строку пробелами и выбрать по позиции. Любые советы будут высоко оценены.

1 Ответ

1 голос
/ 10 апреля 2020

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

middle <- gsub("^\\S+\\s*|\\s*\\S+$", "", name)
# => [1] "Freddy"  ""  "Freddy Freddy"  "Freddy Samuel Freddy"

См. Демо R и демо regex .

Подробности

  • ^\S+\s* - начало строки (^), один или несколько непробельных символов (\S+), а затем 0+ пробельных символов
  • | - или
  • \s*\S+$ - 0+ пробельных символов, один или несколько непробельных символов (\S+) и затем конец строки ($).

Используя stringr, вы можете кредитное плечо str_match:

> str_match(name, '^(\\S+)\\s*(.*?)\\s*(\\S+)$')[,-1]
     [,1]    [,2]                   [,3]   
[1,] "James" "Freddy"               "Peter"
[2,] "James" ""                     "Peter"
[3,] "James" "Freddy Freddy"        "Peter"
[4,] "James" "Freddy Samuel Freddy" "Peter"

См. демонстрационный пример regex , все части которого захвачены на три группы. .*? соответствует любым 0 или более символам, кроме символов разрыва строки, как можно меньше (чтобы сократить пробел перед последним словом).

...