实际上,我想从"b"
中提取"d"
,"f"
和"abcdef"
。我正在这样做:
strsplit("abcdef", "[ace]")
,但返回额外的""
。喜欢:
"" "b" "d" "f"
该怎么办?我该改变什么表情?并请说明您的解决方案是如何工作的...尽管我尝试了str_extract
。有效。但是我想知道为什么strsplit
不能正常工作。
答案 0 :(得分:3)
拆分字符串时,结果中得到的项目是匹配之间出现的所有字符串部分,即使匹配结果位于字符串的开头/结尾,也包含空字符串。请查看您拥有的字符串,其中-
用匹配项标记为空位置:
-a-b-c-d-e-f-
1| 2 | 3 | 4
由于最后一个匹配项在f
之前,因此不包含结尾的空字符串,但是如果在字符集中包含f
,则会得到一个空的结尾元素:
strsplit("abcdef", "[acef]")
## => [1] "" "b" "d" ""
更多,如果您的比赛似乎是相邻的,您还将获得空元素:
strsplit("abcdef", "[abc]")
## => [1] "" "" "" "def"
因此,每当使用正则表达式分割字符串时,几乎总是会得到空字符串。
您实际上可以使用“反转”模式来匹配您的字符串:
x <- "abcdef"
regmatches(x, gregexpr("[^ace]+", x))
## => [1] "b" "d" "f"
请参见R demo。或者,您可以在找到匹配项后删除空项目(请参见Rui Barradas answer)。
答案 1 :(得分:2)
非正则表达式的解决方案是使用setdiff
拆分字符串中的每个字符并获得非“ a”,“ c”或“ e”的字符。
setdiff(strsplit("abcdef", "")[[1]], c("a", "c", "e"))
#[1] "b" "d" "f"
答案 2 :(得分:1)
一种可能是在拆分后删除空字符串后验。
将strsplit
的结果分配给变量,然后使用逻辑向量对其进行子集化。
res <- strsplit("abcdef", "[ace]")[[1]]
res[sapply(res, `!=`, "")]
#[1] "b" "d" "f"
或更简单,多亏@snoram,
res[sapply(res, nzchar)]
[1] "b" "d" "f"