在R语言中,如何将字符串按空格分割,但不在单引号内的空格不进行分割?

3

我有一组复杂且难以理解的字符串需要拆分:

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'" 

我需要将字符串按照空格()分割,但是在'之间的空格不应该被分割。因此,在上面的示例中,'01' '02' 将变为 '01''02',而 #'autres 32' #'batiment 30' 将变为 #'autres 32'#'batiment 30'
我已经尝试从这个问题中获得灵感,但是没有成功:
strsplit(vec, "(\\s[^']+?)('.*?'|$)")

由于此解决方案分割了一些不该分割的空格,导致我丢失了一些信息。

拆分后的结果应该类似于:

res <- c("'01'", "'01'", "'02'", 
         "#bateau", "#bateau", "#batiment",
         "#'autres 32'", "#'autres 32'", "#'batiment 30'", "#'autres 32'", "#'batiment 30'", "#'contenu 31'",
         "#'34'", "#'34'", "#'33'", "#'35'")

应该使用什么正则表达式来拆分这个字符串?

谢谢

1个回答

5

你可以使用

strsplit(vec, "'[^']*'(*SKIP)(*F)|\\s+", perl=TRUE)

请看R演示正则表达式演示

细节

  • '[^']*'(*SKIP)(*F) - 匹配',然后是除'之外的0个或多个字符(参见[^']*),接着是'。匹配到的文本将被丢弃,并从当前匹配失败的位置开始搜索下一个匹配项(参见(*SKIP)(*F)
  • | - 或
  • \s+ - 1个或多个空格字符。

由于它是一个PCRE模式,所以perl=TRUE是必须的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接