2017-02-07 2 views
2

После многих попыток поиска и бесплодных попыток я надеюсь, что кто-то может помочь с этим, по общему признанию, легким вопросом (хотя регулярные выражения для меня явно незнакомы).Регулярное выражение для рисунка между запятой и периодом

У меня есть следующий тип данных:

name <- c("Doe, Mr. John") 

и я хочу «мистер» от этого, но фактическое название меняется. Мой главный вопрос заключается в том, как я пишу регулярное выражение, чтобы захватить только часть «г-н», без чего-либо еще?

Мой текущий подход заключается в следующем:

library(stringr) 
str_split(name, "[,\\s.]")[[1]][[3]] 

и лучшее, что я сумел сделать с помощью экстракции был такой:

str_extract(name, ", .*\\.") 

Я уверен, что есть более простой способ, кто может мне помочь ?

ответ

5

Вы можете соответствовать всем буквам перед точкой:

> name <- c("Doe, Mr. John") 
> str_extract(name, "\\p{L}+(?=\\.)") 
[1] "Mr" 

Где \\p{L}+ матчи 1 или более букв и (?=\\.) является положительным опережением требует точки сразу после них.

То же самое можно сделать с базовой R regmatches/regexpr с использованием регулярных выражений PCRE (путем пропускания perl=TRUE аргумент regexpr):

Подобное регулярное выражение можно использовать с str_match, чтобы обеспечить только мы соответствует слово после запятой, пробелов и прямо перед точкой:

> str_match(name, ",\\s*(\\p{L}+)\\.")[,2] 
[1] "Mr" 
+0

Это выглядит очень красиво! Большое спасибо. Быстрый, но смежный вопрос: как заставить «,» быть одним «персонажем» (группа?)? Например, когда я использовал функцию str_split, мое первоначальное намерение состояло в том, чтобы разбить строку на «,» (т. Е. Включая пробел), а также на «.». Но так, как я его написал, это интерпретировалось как «разделение на запятую, точку и пробелы». – hejseb

+0

Возможно, вы имеете в виду, что вы действительно хотели 'str_split (name," [,.] \\ s * ") [[1]] [2]'? Класс символов '[,.]' Соответствует либо ',', либо '.' в текущей позиции. –

+0

BTW, '\ p {L}' можно заменить на '[[: alpha:]]'. Если вам нужно только поддерживать буквы ASCII, вместо '\ p {L}', вы можете использовать обычный класс символов [[A-Za-z]]. –

1

Мы можем использовать sub из base R

sub("^[^ ]+\\s+([^.]+)\\..*", '\\1', name) 
#[1] "Mr" 
Смежные вопросы