逗号和句点之间的模式的正则表达式

hej*_*seb 2 regex r stringr

经过几个小时的谷歌搜索和徒劳无功的尝试,我希望有人可以帮助解决这个公认的简单问题(虽然显然我的regexps是相当陌生的).

我有以下类型的数据:

name <- c("Doe, Mr. John")
Run Code Online (Sandbox Code Playgroud)

我想要"先生",但实际的标题各不相同.我的主要问题是我如何编写正则表达式来捕获"先生"部分,而没有其他任何东西?

我目前的做法如下:

library(stringr)
str_split(name, "[,\\s.]")[[1]][[3]]
Run Code Online (Sandbox Code Playgroud)

我设法使用提取做的最好的是:

str_extract(name, ", .*\\.")
Run Code Online (Sandbox Code Playgroud)

我确信有一种更简单的方法,任何人都可以帮助我吗?

Wik*_*żew 5

您可以匹配点之前的所有字母:

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

其中\\p{L}+1个或多个字母相匹配,并且(?=\\.)是正向前查找需要点后,他们的权利.

基于R regmatches/ regexpr使用PCRE正则表达式(通过传递perl=TRUE参数regexpr)可以完成相同的操作:

> regmatches(name, regexpr("\\p{L}+(?=\\.)", name, perl=TRUE))
[1] "Mr"
Run Code Online (Sandbox Code Playgroud)

类似的正则表达式可以与a str_match一起使用,以确保我们只在逗号,空格之后和点之前匹配单词:

> str_match(name, ",\\s*(\\p{L}+)\\.")[,2]
[1] "Mr"
Run Code Online (Sandbox Code Playgroud)