R 使用 tidyr::separate 在最后一个空白字符处拆分字符串
R split string at last whitespace chars using tidyr::separate
假设我有这样一个数据框:
df<-data.frame(a=c("AA","BB"),b=c("short string","this is the longer string"))
我想根据最后出现的 space 使用正则表达式拆分每个字符串。
我试过了:
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,那就太好了。
我们可以通过使用捕获组 ((...)
) 从 tidyr
使用 extract
。我们匹配零个或多个字符(.*
)并将其放在括号内((.*)
),然后是零个或多个space(\s+
),然后是下一个捕获组仅包含不是 space ([^ ]
) 的字符,直到字符串的末尾 ($
)。
library(tidyr)
extract(df, b, into = c('partA', 'partB'), '(.*)\s+([^ ]+)$')
# a partA partB
#1 AA short string
#2 BB this is the longer string
您可以将正则表达式的 [^ ]*$
部分变成 (?=[^ ]*$)
非消耗模式,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
假设我有这样一个数据框:
df<-data.frame(a=c("AA","BB"),b=c("short string","this is the longer string"))
我想根据最后出现的 space 使用正则表达式拆分每个字符串。 我试过了:
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,那就太好了。
我们可以通过使用捕获组 ((...)
) 从 tidyr
使用 extract
。我们匹配零个或多个字符(.*
)并将其放在括号内((.*)
),然后是零个或多个space(\s+
),然后是下一个捕获组仅包含不是 space ([^ ]
) 的字符,直到字符串的末尾 ($
)。
library(tidyr)
extract(df, b, into = c('partA', 'partB'), '(.*)\s+([^ ]+)$')
# a partA partB
#1 AA short string
#2 BB this is the longer string
您可以将正则表达式的 [^ ]*$
部分变成 (?=[^ ]*$)
非消耗模式,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