我有一个向量,我需要将姓氏提取到列表中。然后,我将使用该列表与使用匹配的一组姓氏进行比较。我在提取姓氏时遇到问题。这是
的一个例子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)
这是假设选择除姓氏之外的所有内容但它不起作用。它返回的只是空白。 “”“”“”
我想知道是否有人可以帮我这个?
答案 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")