Regex 在R中使用strsplit(),忽略括号中的任何内容
我试图在R中使用Regex 在R中使用strsplit(),忽略括号中的任何内容,regex,r,strsplit,Regex,R,Strsplit,我试图在R中使用strsplit()来根据逗号将字符串拆分为几段,但我不想在括号中拆分任何内容。我认为答案是一个正则表达式,但我正在努力使代码正确 例如: x <- "This is it, isn't it (well, yes)" > strsplit(x, ", ") [[1]] [1] "This is it" "isn't it (well" "yes)" 我们可以使用PCREregex来FAIL任何,后面是(前面是),然后按,和0或更多的空格(\\s*)分割
strsplit()
来根据逗号将字符串拆分为几段,但我不想在括号中拆分任何内容。我认为答案是一个正则表达式,但我正在努力使代码正确
例如:
x <- "This is it, isn't it (well, yes)"
> strsplit(x, ", ")
[[1]]
[1] "This is it" "isn't it (well" "yes)"
我们可以使用
PCRE
regex来FAIL
任何,
后面是(
前面是)
,然后按,
和0或更多的空格(\\s*
)分割
我建议另一个带有
(*SKIP)(*F)
的正则表达式忽略所有(…)
子字符串,只匹配括号外的逗号:
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too)"
strsplit(x, "\\([^()]*\\)(*SKIP)(*F)|\\h*,\\h*", perl=T)
x另一种方法:
添加到@Wiktor的示例字符串中
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"
那么,|(?>\(.*?\\).\\K(,|$)
是如何匹配的呢
|
捕获两侧的任意一个组
- 左边是字符串
,
- 在右边,
(?>\(.*?\).*?\\K(,|$)
:
(?>…)
设置,不允许回溯重新评估匹配的内容
- 在本例中,它查找一个开括号(
\\(
)
- 然后,从0到无限次(
*
)重复的任何字符(
),但尽可能少(?
),即
)被延迟计算
- 然后,前面的
重复受到第一个右括号(\\)
的限制
- 后跟另一组重复0到尽可能少的任意字符(
*?
)
- 在比赛结束时,这场比赛已经结束,并为新的比赛设定了起点
- 前面的
*?
受到捕获组((…)
)的限制,捕获组的|
为
- 选择实际的文本字符串,
,
- 如果没有更多逗号,则将
\\K
移动到行尾$
*呼*
如果我的解释令人困惑,请参阅上面链接的文档,然后查看,您可以在其中输入上述正则表达式(单转义-\
-而不是R样式的双转义-\\
)和测试字符串,以查看它匹配的内容,并获得它所做操作的解释。您需要在正则表达式框旁边的框中设置g
(全局)修饰符,以显示所有匹配项,而不仅仅是第一个匹配项
快乐strsplit
ing 您尝试将大括号(…)
用作不可拆分的块作用域,并且必须将您的意图放入拆分regexp中。这不是一个简单的任务。你劫持了斯特里比雪夫的帐户吗?o_O@BhargavRao当前位置这是我的帐户,我刚刚更改了名称。你可以每月做一次,所以:)这太棒了。谢谢非常有用。谢谢
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too)"
strsplit(x, "\\([^()]*\\)(*SKIP)(*F)|\\h*,\\h*", perl=T)
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?"