在空格处分割R字符串,但当空格在单引号之间时不分割

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在空格处分割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''02',而#'autres 32' #'batiment 30'将变为#'autres 32'#'batiment 30'

我曾尝试从this question中获得启发,但没有走得太远:

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

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

谢谢

答案

您可以使用

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

请参见R demoregex demo在线。

详细信息

  • '[^']*'(*SKIP)(*F)-',然后是除'(请参阅[^']*)之外的任何0+字符,然后是',然后将该匹配的文本丢弃,并从以下位置搜索下一个匹配项当前匹配失败(请参见(*SKIP)(*F)
  • (*SKIP)(*F)-或
  • |-1+个空格字符。

由于是PCRE模式,因此s+是必需的。

以上是关于在空格处分割R字符串,但当空格在单引号之间时不分割的主要内容,如果未能解决你的问题,请参考以下文章

用空格和冒号分割字符串,但如果在引号内则不分割

正则表达式用于在不被单引号或双引号包围时使用空格分割字符串

Java 以空格分割字符串

c语言 讲一个字符串str以空格为分割,分割后输出到一个一维数组

python字符串的操作(去掉空格strip(),切片,查找,连接join(),分割split(),转换首字母大写, 转换字母大小写...)

在Java [重复]中的多个空格上分割字符串