首页 > 解决方案 > 在空格处拆分 R 字符串,但在空格位于单引号之间时不拆分

问题描述

我有一组丑陋而复杂的字符串,我必须拆分:

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'and '02'while#'autres 32' #'batiment 30'会变成#'autres 32'and #'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'")

拆分此字符串的正确正则表达式是什么?

谢谢

标签: rregex

解决方案


您可以使用

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

在线查看R 演示正则表达式演示

细节

  • '[^']*'(*SKIP)(*F)- ,然后是除(see ) 和 then'之外的任何 0+ 字符,然后丢弃此匹配的文本,并从当前匹配失败的位置开始搜索下一个匹配项 (see )'[^']*'(*SKIP)(*F)
  • |- 或者
  • \s+- 1+ 空白字符。

由于它是 PCRE 模式,因此perl=TRUE是强制性的。


推荐阅读