使用strsplit正则表达式分割文本

时间:2018-08-10 07:41:01

标签: r regex

实际上,我想从"b"中提取"d""f""abcdef"。我正在这样做:

strsplit("abcdef", "[ace]")

,但返回额外的""。喜欢:

"" "b" "d" "f"

该怎么办?我该改变什么表情?并请说明您的解决方案是如何工作的...尽管我尝试了str_extract。有效。但是我想知道为什么strsplit不能正常工作。

enter image description here

3 个答案:

答案 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"