R:基于条件的正则表达式首次出现

R:基于条件的正则表达式首次出现,r,regex,R,Regex,我试图使用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

我试图使用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"

string不确定您真正想要什么,但根据您的要求,您可以使用

^(.{3,}?)(?:(?<!,)\\s)+(.*)
屈服

[1] "Le jour"    "Les"        "les, jours"


因此,您可能需要一个
dataframe
,如果需要,您可以定义一个小函数(使用
sapply
和一些逻辑):


make_df这将产生
字符串来解决它,谢谢。我的目标是使用3个字符(包括
ä,ü,…
或标点符号)后的第一个空格分割字符串。你知道如何修改模式s.t.
“les,jours les nuits”
获取
c(“les,jours”,“les nuits”)
,例如,忽略逗号后面的空格?@A.Grothendieck:更新答案后,可以使用带
perl=TRUE
的lookback,确保空格前面没有逗号。
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"      
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))
       part1           part2
1    Le jour         la nuit
2        Les jours les nuits
3 les, jours       les nuits
4       <NA>            <NA>