使用R中的RegEx拆分字符串

时间:2015-12-13 18:18:30

标签: regex r split

假设我们有以下字符串。

str <- '<a><b><c>';

我需要拆分它,以便输出是'a''b''c'的矢量。

基本上我可能需要一个RegEx拆分功能,它从原始字符串中取出<(*)>的实例并将它们添加到一个新的矢量中。

5 个答案:

答案 0 :(得分:4)

str <- '<a><b><c>'
str <- gsub('<|>','',str)
str <- unlist(strsplit(str,'',fixed=TRUE))  # or: strsplit(str,'',fixed=TRUE)[[1]]

给出:

> str
[1] "a" "b" "c"

回应你的评论:

str2 <- '<ab><bc><cd>'
str2 <- unlist(strsplit(str2,'><',fixed=TRUE))  # or: strsplit(str2,'><',fixed=TRUE)[[1]]
str2 <- gsub('<|>','',str2)

给出:

> str2
[1] "ab" "bc" "cd"

答案 1 :(得分:2)

1)strsplit / gsub 删除<个字符,然后按>分割。 (人们可能已经预料到这会在结尾处留下零字符组件,但幸运的是,由于strsplit的工作方式不会发生这种情况。)此解决方案特别短,不使用任何包。

unlist(strsplit(gsub("<", "", str), ">"))
## [1] "a" "b" "c"

2)scan / chartr 用空格替换<>个字符,然后使用扫描读取剩下的内容。此解决方案不使用任何包,特别简单,但取决于不包含空格的字段:

scan(textConnection(chartr("<>", "  ", str)), what = "", quiet = TRUE)
## [1] "a" "b" "c"

3)gsubfn包中的strapplyc strapplyc提取与正则表达式匹配的字段。 (stringr包也提供了类似的功能,而base R提供了regmatches,它也可以做到这一点,但有点笨拙。)这个解决方案很短但确实使用了包。

library(gsubfn)

strapplyc(str, "[^<>]+", simplify = c)
[1] "a" "b" "c"

答案 2 :(得分:1)

首先,strsplit'&gt;&lt;'换别的。我选择了一个空间。这是您稍后strsplit的内容。然后,删除'&gt;'和'&lt;'。然后你可以unlist在太空中。如果需要,请使用str1 <- '<a><b><c>'; str1 <-gsub('><',' ',str1) str1 <-gsub('>|<','',str1) strsplit(str1,' ') #"a" "b" "c"

GIDSignIn.sharedInstance().allowsSignInWithWebView = false
GIDSignIn.sharedInstance().allowsSignInWithBrowser = false

答案 3 :(得分:1)

您可以使用strsplit和正则表达式/[<>]+/进行拆分,然后使用lapply过滤掉所有空结果:

str <- '<ab><bc><cd>'
unlist(lapply(strsplit(str,"[<>]+"), function(x){x[!x ==""]}))
//[1] "ab" "bc" "cd"

或者只是删除第一个空arg:

unlist(strsplit(str,"[<>]+"))[-1]
//[1] "ab" "bc" "cd"

答案 4 :(得分:1)

我们可以使用str_extract_all

library(stringr)
str_extract_all(str2, '[a-z]+')[[1]]
#[1] "ab" "bc" "cd"