提取字符串中两个符号之间的所有内容

时间:2014-02-16 15:13:42

标签: regex r gsub

我有一个包含一些名字的向量。我想在每一行中提取标题,基本上是“,”(包括空格)和“。”之间的所有内容。

> head(combi$Name)
[1] "Braund, Mr. Owen Harris"
[2] "Cumings, Mrs. John Bradley (Florence Briggs Thayer)"
[3] "Heikkinen, Miss. Laina"
[4] "Futrelle, Mrs. Jacques Heath (Lily May Peel)"
[5] "Allen, Mr. William Henry"
[6] "Moran, Mr. James"

我认为gsub可能会有用但我很难找到合适的正则表达式来满足我的需求。

2 个答案:

答案 0 :(得分:10)

1)sub sub

> sub(".*, ([^.]*)\\..*", "\\1", Name)
[1] "Mr"   "Mrs"  "Miss" "Mrs"  "Mr"   "Mr"  

1a)子变体 gsub的这种方法也有效:

> sub(".*, |\\..*", "", Name)
[1] "Mr"   "Mrs"  "Miss" "Mrs"  "Mr"   "Mr"  

2)strapplyc 或在gusbfn包中使用strapplyc,可以使用更简单的正则表达式来完成:

> library(gsubfn)
>
> strapplyc(Name, ", ([^.]*)\\.", simplify = TRUE)
[1] "Mr"   "Mrs"  "Miss" "Mrs"  "Mr"   "Mr"  

2a)strapplyc变异这个似乎有最简单的正则表达式。

> library(gsubfn)
>
> sapply(strapplyc(Name, "\\w+"), "[", 2)
[1] "Mr"   "Mrs"  "Miss" "Mrs"  "Mr"   "Mr"  

3)strsplit 第三种方式是使用strsplit

> sapply(strsplit(Name, ", |\\."), "[", 2)
[1] "Mr"   "Mrs"  "Miss" "Mrs"  "Mr"   "Mr"  

添加了其他解决方案。将gsub更改为sub(尽管gsub也有效)。

答案 1 :(得分:2)

不要注意G.格洛腾迪克的答案中缺少任何东西。我只想使用sub和非贪婪重复添加解决方案:

vec <- c("Moran, Mr. James",
         "Rothschild, Mrs. Martin (Elizabeth L. Barrett)")

sub(".*, (.+?)\\..*", "\\1", vec)
# [1] "Mr"  "Mrs"

使用regexprregmatches和lookbehind / lookahead的另一种选择:

regmatches(vec, regexpr("(?<=, ).+?(?=\\.)", vec, perl = TRUE))
# [1] "Mr"  "Mrs"