经过数小时的谷歌搜索和无果而终的尝试,我希望有人可以帮助解决这个公认的简单问题(尽管我显然对正则表达式相当陌生)。
我有以下类型的数据:
name <- c("Doe, Mr. John")
我想从中得到“先生”,但实际的头衔各不相同。我的主要问题是如何编写正则表达式以仅捕获“Mr”部分,而没有其他任何内容?
我目前的做法如下:
library(stringr)
str_split(name, "[,\\s.]")[[1]][[3]]
我使用提取设法做到的最好的是:
str_extract(name, ", .*\\.")
我确定有更简单的方法,有人可以帮助我吗?
最佳答案
您可以匹配点之前的所有字母:
> name <- c("Doe, Mr. John")
> str_extract(name, "\\p{L}+(?=\\.)")
[1] "Mr"
在哪里\\p{L}+
匹配 1 个或多个字母和 (?=\\.)
是一个积极的前瞻,需要紧跟在它们之后。
同样可以用 base R regmatches
来完成/regexpr
使用 PCRE 正则表达式(通过将 perl=TRUE
参数传递给 regexpr
):
> regmatches(name, regexpr("\\p{L}+(?=\\.)", name, perl=TRUE))
[1] "Mr"
类似的正则表达式可以与 str_match
一起使用确保我们只匹配逗号、空格之后和点之前的单词:
> str_match(name, ",\\s*(\\p{L}+)\\.")[,2]
[1] "Mr"
关于逗号和句点之间模式的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42088577/