在R中选择带有正则表达式的姓氏

时间:2015-08-18 05:08:11

标签: regex r

我有一个向量,我需要将姓氏提取到列表中。然后,我将使用该列表与使用匹配的一组姓氏进行比较。我在提取姓氏时遇到问题。这是

的一个例子
Suzanne Sar Abay bob, Lucy Heaton, Lynn Slaney, Michael Hughes,

我需要这些的姓氏。

vector <- gsub("\s(\w+)$", "", data_agent$Name, perl = TRUE)

这最终给了我Suzanne Sar Abay,Lucy,Lynn,Michael。不是姓氏。正则表达式成功选择姓氏。但是,已实现gsub替换了该值。

vector1 <- gsub("(.+)\s\w+$", "", data_agent$List.Name, perl = TRUE)

这是假设选择除姓氏之外的所有内容但它不起作用。它返回的只是空白。 “”“”“”

我想知道是否有人可以帮我这个?

3 个答案:

答案 0 :(得分:1)

保持简单。只需删除最后一个空格中的所有字符。

只需使用sub,

sub(".*\\s", "", data_agent$Name)
默认情况下,

.*是贪婪的,它匹配最后一个字符,然后它回溯到最后一个空格,因为我们在\\s旁边加了.*。所以它匹配到最后一个空格的所有字符。

示例:

> x <- c('Suzanne Sar Abay bob', 'Lucy Heaton', 'Lynn Slaney', 'Michael Hughes')
> sub(".*\\s", "", x)
[1] "bob"    "Heaton" "Slaney" "Hughes"

只需提取最后一个字。

> library(stringr)
> str_extract(x, "\\w+$")
[1] "bob"    "Heaton" "Slaney" "Hughes"
> str_extract(x, "\\S+$")
[1] "bob"    "Heaton" "Slaney" "Hughes"

答案 1 :(得分:1)

^.*(?=\\b\\w+$)

您需要将其放入lookahead。请参阅演示。

https://regex101.com/r/uF4oY4/64

gsub("^.*(?=\\b\\w+$)", "", data_agent$List.Name, perl = TRUE)

答案 2 :(得分:0)

代码中存在两个问题。一个是我们需要使用\s\w来逃避\\s\\w(在OP的原始帖子中)。第二个是我们通过将\\w+置于括号((...))内来使用捕获组。在替换中,我们可以使用\\1代替'',它应该有效。

 sub(".*\\s+(\\w+)$", "\\1", data_agent$Name)
 #[1] "bob"    "Heaton" "Slaney" "Hughes"

或使用stringi

library(stringi)
stri_extract_last(data_agent$Name, regex='\\w+')
#[1] "bob"    "Heaton" "Slaney" "Hughes"

数据

 data_agent <- structure(list(Name = c("Suzanne Sar Abay bob", 
 "Lucy Heaton", 
 "Lynn Slaney", "Michael Hughes")), .Names = "Name", row.names = c(NA, 
-4L), class = "data.frame")