使用最后一个完整单词保留字符串直到字符限制,并将剩余单词存储在第二个变量中

时间:2018-01-01 05:36:47

标签: r regex

获取这些示例字符串,我想将它们拆分为长度限制为X或更少的字符,完整的单词位于每个字符串的末尾,其余部分存储在另一列中。单词总是用空格分隔。我遇到this partial solution in TSQL(不为额外的单词创建变量)。但是我需要在R中进行。我在前一个问题中提供了上半部分解决方案,这在新变量中没有剩余的单词。我需要帮助来创建新变量

 {gsub(patt="(^.{2,100})([ ].+)", repl="\\1",y)}

例如:

XOVEW VJIEW NI **stays** XOVEW VJIEW NI (assuming X is 14)
XOVEW VJIEW NIGOI **becomes** XOVEW VJIEW (NIGOI goes to a new vector) 
XOVEW VJIEWNIGOI **becomes** XOVEW (assuming X is 14)

所以新变量将包含来自上面第2和第3行的c("NIGOI","VJIEWNIGOI")

1 个答案:

答案 0 :(得分:1)

v1 <- ifelse( nchar(vect) > 14, gsub( "(.*)\\s+(\\w+)", "\\1 - \\2", vect),vect); 

values <- data.frame(do.call('rbind', lapply(strsplit(v1,split="-"), `length<-`,2)));

<强>输出

     [,1]             [,2]         
[1,] "XOVEW VJIEW NI" NA           
[2,] "XOVEW VJIEW "   " NIGOI"     
[3,] "XOVEW "         " VJIEWNIGOI"

我创建了一个小向量,它会检查你的字符串长度是大于还是小于14(?nchar以防你理解它。)

然后,无论何时,它都超过14我创建了一个由短划线分隔的字符串,这只是为了隔离两个字符串,其中第一个字符串断言任何不是最后一个字的集合,第二个字符串匹配声明的最后一句话。

为了匹配这些我使用的正则表达式,dot表示任何字符,star零个或多个匹配(一起表示任何匹配零个或多个匹配的字符),\\s+匹配1个或多个空格,\\w+匹配一个或多个单词。总的来说,匹配是这样的,如果在ifelse中字符串长度大于14,它应该具有与字符串的其余部分隔离的最后一个字。此外,这些字符还会以{dash}分隔进入\\1\\2。其中\\1匹配第一个非最后一个字匹配,\\2匹配字符串的最后一个字。

最后do.callrbind一起使用(绑定所有行)和lapply(以便在所有元素中获得偶数列)

我希望这可以解释您的疑问。