基于条件的正则表达式第一次出现

3

我正在尝试使用在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

我不确定如何实现这一点,感谢您提供指导。

1个回答

3

根据您的要求,我不确定您真正想要什么,但您可以使用以下内容:

^(.{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>

解决了,谢谢。我的目标是使用3个字符(包括ä、ü…或标点符号)后面的第一个空格来分割字符串。 - niko
你知道如何修改模式,使得"les, jours les nuits"变成c("les, jours", "les nuits")吗?也就是忽略逗号后面的空格。 - niko
@A.Grothendieck:已更新答案,您可以使用带有perl = TRUE的回顾后断言确保逗号前面没有空格。 - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接