r分隔符不在括号中

use*_*888 4 regex r

我目前正在尝试在管道分隔符上拆分一个字符串: 

999|150|222|(123|145)|456|12,260|(10|10000)
Run Code Online (Sandbox Code Playgroud)

问题是我不想|在括号内分开,我只想在括号外分割这个字符.

这只是分裂每个|角色,产生我不想要的结果:

x <- '999|150|222|(123|145)|456|12,260|(10|10000)'
m <- strsplit(x, '\\|')

[[1]]
[1] "999"    "150"    "222"    "(123"   "145)"   "456"    "12,260" "(10"   
[9] "10000)"
Run Code Online (Sandbox Code Playgroud)

我希望得到以下结果,保持括号内的所有内容:

[[1]]
[1] "999"        "150"        "222"        "(123|145)"  "456"       
[6] "12,260"     "(10|10000)"
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏.

hwn*_*wnd 12

您可以PCRE通过使用perl=T和一些黑暗魔法打开:

x <- '999|150|222|(123|145)|456|12,260|(10|10000)'
strsplit(x, '\\([^)]*\\)(*SKIP)(*F)|\\|', perl=T)

# [[1]]
# [1] "999"        "150"        "222"        "(123|145)"  "456"       
# [6] "12,260"     "(10|10000)"
Run Code Online (Sandbox Code Playgroud)

我们的想法是跳过括号中的内容.现场演示

交替运算符的左侧,我们匹配括号中的任何内容,使子模式失败并强制正则表达式引擎不使用回溯控制重试子字符串.交替运算符的右侧匹配|(括号外,我们想要的......)

  • 确实很黑. (4认同)

Mat*_*rde 6

一种选择:

scan(text=gsub("\\(|\\)", "'", x), what='', sep="|")
#[1] "999"      "150"      "222"      "123|145"  "456"      "12,260"   "10|10000"
Run Code Online (Sandbox Code Playgroud)

这是另一种使用方式strsplit.这里有其他答案strsplit,但这似乎是最简单的模式:

strsplit(x, "\\|(?!\\d+\\))", perl=TRUE)
# [1] "999"        "150"        "222"        "(123|145)"  "456"        "12,260"     "(10|10000)"
Run Code Online (Sandbox Code Playgroud)