R得到字符串匹配

时间:2014-01-10 16:11:41

标签: r get match

我向上帝发誓我在过去60分钟搜索了整个互联网,谷歌搜索如“r get match”ecetera。我不想为这项简单的任务安装任何图书馆员。我有一个字符串"something1_something2",我希望得到something1

a<-"hi_there"

根据一些论坛条目,我应该用sub来获取它:

> sub("hi_", "\\1", a)
[1] "there"

我想获得"hi",但我似乎无法获得"hi_"。我尝试了一千件事,我该怎么做?

4 个答案:

答案 0 :(得分:3)

尝试 strsplit 将字符串分解为块:

x = c("hi_there", "this#is#sparta")
chunks = strsplit(x, c("_", "#"))

# first word
print(chunks[[1]])
[1] "hi"    "there"

# second word
print(chunks[[2]])
[1] "this"   "is"     "sparta"

答案 1 :(得分:1)

这可能有点棘手。您需要在匹配整个字符串的模式中创建一个捕获组,以将整个字符串替换为捕获组中的内容:

sub("(hi)_.+","\\1",a)
[1] "hi"

答案 2 :(得分:1)

regexec / regmaches也会这样做,尽管strsplit方法对于这个特定问题更简单。

a <- c("hi_there", "something_somthing", "boo_ya_yo")
sapply(regmatches(a, regexec("^([^_]*)", a)), `[[`, 2)
# [1] "hi"        "something" "boo"      

这种方法的主要优点是,如果您有其他要求(例如,您还希望最左边的部分以辅音或其他形式开头),您可以通过修改正则表达式来解决这些问题。

答案 3 :(得分:1)

我猜你正在寻找从字符向量元素的开头到第一个下划线的子字符串。你只会找到一个匹配项(只有一个子字符串可以启动元素)所以sub是要去的地方,要么匹配所需的字符串(请查看字符串^捕获的开头零个或多个不是下划线([^_]*)的字符,后跟下划线,可能还有其他字符_.*

re1 = "^([^_]*)_.*"
sub(re1, "\\1", x)

或删除第一个下划线后的内容(下划线_后跟零个或多个任何其他字符.*

re2 = "_.*"
sub(re2, "", x)

进行一些测试

x = c("a_b", "a_", "_b", "a", "a_b_c", "", NA)
sub(re1, "\\1", x)
## [1] "a" "a" ""  "a" "a" ""  NA 
sub(re2, "", x)
## [1] "a" "a" ""  "a" "a" ""  NA 

strsplit解决方案失败了。