Regex &引用;姓、名-&燃气轮机&引用;名姓;在序列化字符串中

Regex &引用;姓、名-&燃气轮机&引用;名姓;在序列化字符串中,regex,string,r,Regex,String,R,我有一组字符串,其中包含姓、名格式的姓名列表,以逗号分隔,如下所示: names <- c('Beaufoy, Simon, Boyle, Danny','Nolan, Christopher','Blumberg, Stuart, Cholodenko, Lisa','Seidler, David','Sorkin, Aaron') names如果您可以确定一个人的名字中不会有逗号,这可能会起作用: mynames <- c('Beaufoy, Simon, Boyle, Dan

我有一组字符串,其中包含姓、名格式的姓名列表,以逗号分隔,如下所示:

names <- c('Beaufoy, Simon, Boyle, Danny','Nolan, Christopher','Blumberg, Stuart, Cholodenko, Lisa','Seidler, David','Sorkin, Aaron')

names如果您可以确定一个人的名字中不会有逗号,这可能会起作用:

mynames <- c('Beaufoy, Simon, Boyle, Danny',
             'Nolan, Christopher',
             'Blumberg, Stuart, Cholodenko, Lisa',
             'Seidler, David',
             'Sorkin, Aaron',
             'Hoover, J. Edgar')
mynames2 <- strsplit(mynames, ", ")

unlist(lapply(mynames2, 
              function(x) paste(x[1:length(x) %% 2 == 0], 
                                x[1:length(x) %% 2 != 0])))
# [1] "Simon Beaufoy"     "Danny Boyle"       "Christopher Nolan"
# [4] "Stuart Blumberg"   "Lisa Cholodenko"   "David Seidler"    
# [7] "Aaron Sorkin"      "J. Edgar Hoover"        

我赞成@AnandaMahto的答案,但只是为了好玩,这说明了另一种使用
scan
split
rappy
的方法

names <- c(names, 'Chambers, John, Ihaka, Ross, Gentleman, Robert')

# extract names
snames <- 
lapply(names, function(x) scan(text=x, what='', sep=',', strip.white=TRUE, quiet=TRUE))

# break up names
snames<-lapply(snames, function(x) split(x, rep(seq(length(x) %/% 2), each=2)))

# collapse together, reversed
rapply(snames, function(x) paste(x[2:1], collapse=' '))
名称(1)在每个元素中保持相同的名称这可以通过单个
gsub
完成(假设名称中没有逗号):

(2)每个元素分为一个名称如果您希望每个名字和姓氏都在一个单独的元素中,请使用(a)扫描

scan(text = out, sep = ",", what = "")
其中,
out
是上述
gsub
的结果,或者直接尝试(b)捆扎

> library(gsubfn)
> strapply(names, "([^, ][^,]*), ([^,]+)", x + y ~ paste(y, x), simplify = c)
[1] "Simon Beaufoy"     "Danny Boyle"       "Christopher Nolan"
[4] "Stuart Blumberg"   "Lisa Cholodenko"   "David Seidler"    
[7] "Aaron Sorkin"     

> strapply("Hoover, Edgar J.", "([^, ][^,]*), ([^,]+)", x + y ~ paste(y, x), 
+   simplify = c)
[1] "Edgar J. Hoover"
请注意,上面的所有示例都使用相同的正则表达式进行匹配

更新:删除了分隔名字和姓氏的逗号


更新:添加了代码,将每个名字和姓氏分隔成一个单独的元素,以防这是首选的输出格式。

它总是成对的名字,还是会有人有两个以上的名字?你的意思是“胡佛,J.埃德加”?可以是。非常不幸的是,同一个分隔符被用来区分姓和名,以及名和其他同姓。但恐怕情况就是这样。事实上(我希望…)逗号不会出现在名字或姓氏中。我认为他的例子缺少了一些引号。如果单个元素包含多个名称,那么在执行简单的正则表达式之前,可能需要做大量的工作(拆分和重新组合以形成唯一的名称等)。@AnandaMahto:或者您的问题是每个字符串中有多少个名称?在这种情况下,答案是可能有一个,可能还有更多。@ChinmayPatil不,这个例子正是它应该的。很好,谢谢!有没有办法在最后把这些线重新连接起来?谢谢你的详细解释。如果可以的话,我会更喜欢这个!那很酷。我没有想到正则表达式会以这种方式工作,所以我没有费心去尝试它!
scan(text = out, sep = ",", what = "")
> library(gsubfn)
> strapply(names, "([^, ][^,]*), ([^,]+)", x + y ~ paste(y, x), simplify = c)
[1] "Simon Beaufoy"     "Danny Boyle"       "Christopher Nolan"
[4] "Stuart Blumberg"   "Lisa Cholodenko"   "David Seidler"    
[7] "Aaron Sorkin"     

> strapply("Hoover, Edgar J.", "([^, ][^,]*), ([^,]+)", x + y ~ paste(y, x), 
+   simplify = c)
[1] "Edgar J. Hoover"