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

regex for pattern between comma and period

经过数小时的谷歌搜索和无果而终的尝试,我希望有人可以帮助解决这个公认的简单问题(尽管我显然对正则表达式相当陌生)。

我有以下类型的数据:

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

我想要 "Mr",但实际标题不同。我的主要问题是如何编写正则表达式以仅捕获 "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 个或多个字母,并且 (?=\.) 是一个正向前瞻,需要紧跟在它们后面。

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

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

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

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

我们可以使用 sub 来自 base R

sub("^[^ ]+\s+([^.]+)\..*", '\1', name)
#[1] "Mr"