我试图在R中使用strsplit()
根据逗号将字符串分成几部分,但我不想在括号中拆分任何内容。我认为答案是正则表达式,但我正在努力使代码正确。
例如:
x <- "This is it, isn't it (well, yes)"
> strsplit(x, ", ")
[[1]]
[1] "This is it" "isn't it (well" "yes)"
当我想要的是:
[1] "This is it" "isn't it (well, yes)"
答案 0 :(得分:15)
我们可以使用PCRE
正则表达式FAIL
,
之前(
)
之前的,
并\\s*
后跟 strsplit(x, '\\([^)]+,(*SKIP)(*FAIL)|,\\s*', perl=TRUE)[[1]]
#[1] "This is it" "isn't it (well, yes)"
0个或更多空格({{1}})
{{1}}
答案 1 :(得分:6)
我建议使用compile (rootProject.ext.jbossBom) {
exclude group: "some.group", module: "some.module"
}
的另一个正则表达式忽略所有(*SKIP)(*F)
子字符串,并且只匹配带括号的子字符串之外的逗号:
(...)
请参阅IDEONE demo
您可以在此处详细了解How do (*SKIP) or (*F) work on regex?。正则表达式匹配:
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too)"
strsplit(x, "\\([^()]*\\)(*SKIP)(*F)|\\h*,\\h*", perl=T)
- 一个开头括号\(
- 除[^()]*
和(
以外的零个或多个字符)
- 结束括号\)
- 将当前正则表达式索引推进到结束括号后的位置的动词(*SKIP)(*F)
- 或...... |
- 包含零个或多个水平空格的逗号。答案 2 :(得分:1)
另一种方法:
添加@ Wiktor的示例字符串,
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"
现在魔术:
> strsplit(x, ", |(?>\\(.*?\\).*?\\K(, |$))", perl = TRUE)
[[1]]
[1] "This is it"
[2] "isn't it (well, yes)"
[3] "and (well, this, that, and this, too). Let's look"
[4] "does it work?"
那么, |(?>\\(.*?\\).*?\\K(, |$))
如何匹配?
|
捕获两侧的任何一组,两者都有
,
(?>\\(.*?\\).*?\\K(, |$))
:
(?> ... )
设置an atomic group,不允许回溯重新评估匹配的内容。\\(
),.
)从0到无穷大(*
)重复,但尽可能少(?
),即.
被懒惰地评估。 .
重复受第一个右括号(\\)
)的限制,.*?
)\\K
,它会抛弃到目前为止的比赛并设置新比赛的起点。.*?
受限于具有( ... )
的捕获组(|
)
,
,\\K
移至该行$
的末尾。*呼。*
如果我的解释令人困惑,请参阅上面链接的文档,然后查看regex101.com,您可以在其中放入上述正则表达式(单个转义 - \
- 而不是R-style double escapeped- \\
)和一个测试字符串,以查看它匹配的内容,并获得它正在做什么的解释。您需要在正则表达式框旁边的框中设置g
(全局)修饰符以显示所有匹配项,而不仅仅是第一个匹配项。
快乐strsplit
ing!