经过几个小时的谷歌搜索和徒劳无功的尝试,我希望有人可以帮助解决这个公认的简单问题(虽然显然我的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)
我确信有一种更简单的方法,任何人都可以帮助我吗?
您可以匹配点之前的所有字母:
> 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)