2016-01-21 2 views
2

У меня есть следующая строка:экстракт строки после первого появления рисунка и перед другим рисунком

strings <- c("David, FC; Haramey, S; Devan, IA", 
      "Colin, Matthew J.; Haramey, S", 
      "Colin, Matthew") 

Если я хочу последние инициалы/GivenName для всех строк я могу использовать следующее:

sub(".*, ", "", strings) 
[1] "IA"  "S"  "Matthew" 

Это удаляет все до последнего ", "

Однако, я застрял на том, как получить первые инициалы/givenn AME. Я знаю, что нужно удалить все перед ", ", но затем я должен удалить все после пробелов, с запятой, если таковые имеются.

Чтобы быть ясно, что выход я хочу это:

c("FC", "Matthew", "Matthew") 

Все указатели было бы здорово.

возился я могу получить первые фамилии gsub(" .*$", "", strings)

ответ

3

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

> gsub("^[^\\s,]+,\\s+([^;.\\s]+).*", "\\1", strings, perl=T) 
[1] "FC"  "Matthew" "Matthew" 

См regex demo

Объяснение:

  • ^ - начало строки
  • [^\\s,]+ - кроме пробельного или ,
  • , 1 или более символов - буквальная запятая
  • \\s+ - 1 или более пробельные
  • ([^;.\\s]+) - Группа 1 соответствие 1 или больше символов, кроме ;, . или пробельные
  • .* - ноль или более любой символ, кроме символа новой строки

Если вы хотите использовать POSIX-подобные выражения, замените \\s внутри символьных классов (внутри [...]) с [:blank:] (или [:space:]):

gsub("^[^[:blank:],]+,\\s+([^;.[:blank:]]+).*", "\\1", strings) 
+1

Спасибо yopu для демонстрации, а также ответ, так что я могу попробовать это обращал внимания. – user1320502

+0

+1 для комментариев каждой части регулярного выражения. Таким образом, он становится меньше черной магии для нас, непосвященных;) – PavoDive

Смежные вопросы