R 使用 tidyr::separate 在最后一个空格字符处拆分字符串
Posted
技术标签:
【中文标题】R 使用 tidyr::separate 在最后一个空格字符处拆分字符串【英文标题】:R split string at last whitespace chars using tidyr::separate 【发布时间】:2015-11-14 04:43:39 【问题描述】:假设我有一个这样的数据框:
df<-data.frame(a=c("AA","BB"),b=c("short string","this is the longer string"))
我想根据最后出现的空格使用正则表达式拆分每个字符串。 我试过了:
library(dplyr)
library(tidyr)
df%>%
separate(b,c("partA","partB"),sep=" [^ ]*$")
但这省略了输出中字符串的第二部分。我想要的输出如下所示:
a partA partB
1 AA short string
2 BB this is the longer string
我该怎么做。如果我可以为此使用 tidyr 和 dplyr 那就太好了。
【问题讨论】:
【参考方案1】:我们可以通过捕获组 ((...)
) 使用来自 tidyr
的 extract
。我们匹配零个或多个字符 (.*
) 并将其放在括号内 ((.*)
),然后是零个或多个空格 (\\s+
),然后是下一个捕获组,其中仅包含非空格字符([^ ]
) 直到字符串的结尾 ($
)。
library(tidyr)
extract(df, b, into = c('partA', 'partB'), '(.*)\\s+([^ ]+)$')
# a partA partB
#1 AA short string
#2 BB this is the longer string
【讨论】:
【参考方案2】:您可以将正则表达式的[^ ]*$
部分转换为(?=[^ ]*$)
非消耗模式,positive lookahead(不会消耗字符串末尾的非空白字符,即它们不会被放入匹配值中,因此将留在输出中):
df%>%
separate(b,c("partA","partB"),sep=" (?=[^ ]*$)")
或者,更通用一点,因为它匹配任何空白字符:
df %>%
separate(b,c("partA","partB"),sep="\\s+(?=\\S*$)")
查看regex demo 及其下图:
输出:
a partA partB
1 AA short string
2 BB this is the longer string
【讨论】:
以上是关于R 使用 tidyr::separate 在最后一个空格字符处拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章
带有 RCurl 的 sftp 协议 - 最后一步,如何将 R 路径从 usr/lib 更改为 usr/local/lib