R获得字符串匹配

R获得字符串匹配,r,get,match,R,Get,Match,我向上帝发誓,在过去的60分钟里,我用谷歌搜索引擎“r get match”ecetera搜索了整个互联网。我不想为这个简单的任务安装任何库。我有一个字符串“something1\u something2”,我想得到something1 a<-"hi_there" 我想得到“hi”,但我似乎连“hi”都得不到。我已经尝试了一千种方法,我该怎么做呢?这可能有点棘手。您需要在与整个字符串匹配的模式中创建一个捕获组,以将整个字符串替换为捕获组中的内容: sub("(hi)_.+","\\1",

我向上帝发誓,在过去的60分钟里,我用谷歌搜索引擎“r get match”ecetera搜索了整个互联网。我不想为这个简单的任务安装任何库。我有一个字符串
“something1\u something2”
,我想得到
something1

a<-"hi_there"

我想得到
“hi”
,但我似乎连
“hi”
都得不到。我已经尝试了一千种方法,我该怎么做呢?

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

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

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

sub("(hi)_.+","\\1",a)
[1] "hi"
请尝试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"
请尝试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"

regexec
/
regmaches
也能做到这一点,尽管对于这个特定问题,
strsplit
方法更简单

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

a
regexec
/
regmaches
也能做到这一点,尽管对于这个特定问题,strsplit
方法更简单

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

a我猜您通常是在查找从character vector元素开始到第一个下划线的子字符串。您只会找到一个匹配项(元素的开头只有一个子字符串),因此
sub
是您要去的地方,或者匹配所需的字符串(查看字符串的开头
^
捕获零个或多个非下划线
([^!]*)
,后跟下划线,可能还有其他字符。
。*)

或者将内容放在第一个下划线之后(一个下划线
\uu
后跟零个或多个其他字符
*

通过一些测试

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
解决方案在某些方面失败。

我猜您通常是在寻找从character vector元素开始到第一个下划线的子字符串。您只会找到一个匹配项(元素的开头只有一个子字符串),因此
sub
是您要去的地方,或者匹配所需的字符串(查看字符串的开头
^
捕获零个或多个非下划线
([^!]*)
,后跟下划线,可能还有其他字符。。*)

或者将内容放在第一个下划线之后(一个下划线
\uu
后跟零个或多个其他字符
*

通过一些测试

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
解决方案在其中一些问题上失败。

strsplit(x,“”)[[1]
gsub((.*)\u(.*),“\\ 1”,a)
很可能是您所想的,但是如果您描述条件而不是告诉我们搜索的历史,它会有所帮助:-)
sub删除匹配的内容!!实际上,您希望
sub(“\\1”,a)
获得
“hi”
。您所描述的是使用
regmatches
提取字符串的匹配部分,其工作原理如下:
regmatches(a,regexpr(“hi”,a))
。请看,同样的事情。strsplit(x,“”)[[1]
gsub((.*)\u(.*),“\\ 1”,a)
很可能是您所想的,但是如果您描述条件而不是告诉我们搜索的历史记录,它会有所帮助:-)
sub
删除匹配的内容!!实际上,您希望
sub(“\\1”,a)
获得
“hi”
。您所描述的是使用
regmatches
提取字符串的匹配部分,其工作原理如下:
regmatches(a,regexpr(“hi”,a))
。看,同样的事情。