我正在尝试使用 3 个字符后的第一个空格来拆分字符串。这是我的代码:
string <- c("Le jour la nuit", "Les jours les nuits")
part1 <- sub("(\\S{3,})\\s?(.*)", "\\1", string)
part2 <- sub("(\\S{3,})\\s?(.*)", "\\2", string)
# output
> part1
[1] "Le jour" "Les"
> part2
[1] "Le la nuit" "jours les nuits"
对于第一部分,它完全按预期工作。但是,第二部分不是这样:part2[1]
应该是 la nuit
而不是 Le la nuit
。
我不确定如何实现这一目标,非常感谢您提供一些指导。
最佳答案
不确定你真正想要什么,但根据你的要求,你可以使用
^(.{3,}?)(?:(?<!,)\\s)+(.*)
这是说:
^ # start of the string
(.{3,}?) # capture 3+ characters lazily, up to...
(?:(?<!,)\\s)+ # 1+ whitespaces that must not be preceeded by a comma
(.*) # capture the rest of the string
在R
:
string <- c("Le jour la nuit", "Les jours les nuits", "les, jours les nuits")
(part1 <- sub("^(.{3,}?)(?:(?<!,)\\s)+(.*)", "\\1", string, perl = T))
(part2 <- sub("^(.{3,}?)(?:(?<!,)\\s)+(.*)", "\\2", string, perl = T))
屈服
[1] "Le jour" "Les" "les, jours"
和
[1] "la nuit" "jours les nuits" "les nuits"
也许你需要一个
dataframe
因此,如果是这样,您可以自己定义一个小函数(使用 sapply
和一些逻辑):
make_df <- function(text) {
parts <- sapply(text, function(x) {
m <- regexec("^(.{3,}?)(?:(?<!,)\\s)+(.*)", x, perl = T)
groups <- regmatches(x, m)
c(groups[[1]][2], groups[[1]][3])
}, USE.NAMES = F)
(setNames(as.data.frame(t(parts), stringsAsFactors = F), c("part1", "part2")))
}
(df <- make_df(string))
这将产生 string <- c("Le jour la nuit", "Les jours les nuits", "les, jours les nuits", "somejunk")
:
part1 part2
1 Le jour la nuit
2 Les jours les nuits
3 les, jours les nuits
4 <NA> <NA>
关于R:基于条件的正则表达式第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49985871/