Regex 使用R中的正则表达式选择姓氏

Regex 使用R中的正则表达式选择姓氏,regex,r,Regex,R,我有一个向量,我需要将姓氏提取到一个列表中。然后,我将使用该列表与使用match的一组姓氏进行比较。我在提取姓氏时遇到问题。下面是一个例子 Suzanne Sar Abay bob, Lucy Heaton, Lynn Slaney, Michael Hughes, 我需要知道这些人的姓 vector <- gsub("\s(\w+)$", "", data_agent$Name, perl = TRUE) 这是假定选择除姓氏以外的所有内容,但它不起作用。它返回的都是空白。“”“ 我想

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

Suzanne Sar Abay bob, Lucy Heaton, Lynn Slaney, Michael Hughes,
我需要知道这些人的姓

vector <- gsub("\s(\w+)$", "", data_agent$Name, perl = TRUE)
这是假定选择除姓氏以外的所有内容,但它不起作用。它返回的都是空白。“”“


我想知道是否有人能帮我解决这个问题?

代码中有两个问题。一是我们需要通过使用
\\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\u agent保持简单。只需删除所有字符直到最后一个空格

只需使用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"
您需要将其置于
前瞻中
。请参阅演示


如果他们有,在名字的末尾说“初级”或“三级”,会发生什么?如果
Michael Hughes
Michael Hughes III
,您是想要
Hughes III
还是只想
Hughes
?@akrun我没有碰代码本身,只是碰缩进。但是使用Ctrl+K似乎改变了
\s
\w
\\s
\\w
@Pascal。谢谢你的澄清。@RichardScriven我还没有真正想过这个问题。我认为出于这个问题的目的,我们可以假设姓氏中增加了一些内容。如果有的话,它在数据集中可以忽略不计。谢谢!这真是太棒了!这比我想做的容易多了。非常感谢你。
sub(".*\\s", "", data_agent$Name)
> 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"
^.*(?=\\b\\w+$)
gsub("^.*(?=\\b\\w+$)", "", data_agent$List.Name, perl = TRUE)