特定角色的strsplit,证明该角色不应该被特定角色所遵循

时间:2015-12-16 08:57:53

标签: r pattern-matching strsplit

我想在遇到“a”时拆分字符串,前提是“a”不应该跟“b”

string <- "abcgualoo87ahhabta"

我应该输出

string <- [1]abcgua
[2]loo87a
[3]hhabta

2 个答案:

答案 0 :(得分:6)

您可以使用模式&#34; a后跟b&#34;来分割字符串。使用a(?=[^b])中的正则表达式strsplit

split_str <- strsplit("abcgualoo87ahhabta", "a(?=[^b])", perl=TRUE)[[1]]
split_str
#[1] "abcgu"  "loo87"  "hhabta"

对分割模式的解释:前瞻((?=))与&#34;前瞻&#34;一起使用。模式,除了b([^b])之外的任何东西(^符号表示否定)。为了使前瞻工作(被解释),我们需要将参数perl设置为TURE

然后你可以添加删除的&#34; a&#34;在拆分部分的末尾,除了最后一部分:

split_str <- paste0(c(rep("a", length(split_str)-1), ""))
#[1] "abcgua" "loo87a" "hhabta"

@nicola在评论中提供的一个很好的一步替代方案:

split_str <- strsplit("abcgualoo87ahhabta","(?<=a)(?!b)", perl=TRUE)[[1]]
#[1] "abcgua" "loo87a" "hhabta"

答案 1 :(得分:2)

string <- "abcgualoo87ahhabta"
unlist(strsplit(gsub("a([^b])", "a \\1", string), split=" "))
# [1] "abcgua" "loo87a" "hhabta"