我有一组丑陋而复杂的字符串,我必须拆分:
vec <- c("'01'", "'01' '02'",
"#bateau", "#bateau #batiment",
"#'autres 32'", "#'autres 32' #'batiment 30'", "#'autres 32' #'batiment 30' #'contenu 31'",
"#'34'", "#'34' #'33' #'35'")
vec
[1] "'01'" "'01' '02'"
[3] "#bateau" "#bateau #batiment"
[5] "#'autres 32'" "#'autres 32' #'batiment 30'"
[7] "#'autres 32' #'batiment 30' #'contenu 31'" "#'34'"
[9] "#'34' #'33' #'35'"
Run Code Online (Sandbox Code Playgroud)
我需要在有空格 ( ) 的任何地方拆分字符串,除非空格在'. 所以在上面的例子中,'01' '02'会变成'01'和'02'而#'autres 32' #'batiment 30'会变成#'autres 32'和#'batiment 30'。
我试过从这个问题中获得灵感,但没走多远:
strsplit(vec, "(\\s[^']+?)('.*?'|$)")
Run Code Online (Sandbox Code Playgroud)
因为这个解决方案分裂了一些不应该的空间,让我也失去了一些信息。
拆分的结果应该是这样的:
res <- c("'01'", "'01'", "'02'",
"#bateau", "#bateau", "#batiment",
"#'autres 32'", "#'autres 32'", "#'batiment 30'", "#'autres 32'", "#'batiment 30'", "#'contenu 31'",
"#'34'", "#'34'", "#'33'", "#'35'")
Run Code Online (Sandbox Code Playgroud)
拆分此字符串的正确正则表达式是什么?
谢谢
您可以使用
strsplit(vec, "'[^']*'(*SKIP)(*F)|\\s+", perl=TRUE)
Run Code Online (Sandbox Code Playgroud)
细节
'[^']*'(*SKIP)(*F)- ', 然后是除'(see [^']*) 和 then之外的任何 0+ 字符',然后丢弃此匹配的文本,并从当前匹配失败的位置搜索下一个匹配 (参见(*SKIP)(*F))| - 或者\s+ - 1+ 个空白字符。由于它是 PCRE 模式,因此perl=TRUE是强制性的。