r - 有条件地将字符串粘贴在一起
问题描述
我拥有的数据是一个向量,其中的句子被切成碎片。
y <- c("G'day", "world and everybody", "else.", "How's life?", "Hope", "you're", "doing just", "fine.")
我想把这些句子重新组合起来。
预期结果:
y
[1] "G'day world and everybody else."
[2] "How's life?"
[3] "Hope you're doing just fine."
有一个句子的“规则”是它以大写字母开头。在此规则的基础上,到目前为止我尝试过的是(但结果并不令人满意):
unlist(strsplit(paste0(y[which(grepl("^[A-Z]", y))], " ", y[which(grepl("^[a-z]", y))], collapse = ","), ","))
[1] "G'day world and everybody" "How's life? else." "Hope you're" "G'day doing just"
[5] "How's life? fine."
编辑:
提出了这个解决方案,它确实给出了预期的结果,但看起来很丑:
y1 <- c(paste0(y[grepl("^[A-Z].*[^.?]$", y, perl = T)], " ", unlist(strsplit(paste0(y[which(grepl("^[a-z]", y))], collapse = " "), "\\."))), y[grepl("^[A-Z].*[.?]$", y, perl = T)])
y1
[1] "G'day world and everybody else" "Hope you're doing just fine" "How's life?"
有什么更好的解决方案?
编辑 2:
这也是一个很好的解决方案:
library(stringr)
str_extract_all(paste(y, collapse = " "), "[A-Z][^.?]*(\\.|\\?)")
解决方案
我会使用 agsub
在每个大写字母之前插入一个新行,然后在新行处拆分:
unlist(strsplit(gsub(" ([A-Z])", "\n\\1", paste(y, collapse = " ")), "\n"))
#> [1] "G'day world and everybody else." "How's life?"
#> [3] "Hope you're doing just fine."
由reprex 包(v0.3.0)于 2020 年 5 月 28 日创建
推荐阅读
- jquery - 带有localStorage的jQuery单击功能不起作用
- python - 我得到 ModuleNotFoundError: No module named 'Cython' 尝试制作扩展时
- visual-studio-code - Visual Studio Code Live Share 自动完成非常延迟
- flutter - 在 Flutter 中实现通知逻辑
- python - 在 Python 3 中打印给定系列的谐波系列
- linux - 即使在步骤完成后,如何继续从 Jenkins 管道运行命令/bat 文件?
- python - 如何从 read_game 的最终位置获得棋盘?
- javascript - 将字符串转换为数字,具体取决于它们是否具有后缀,例如 1.5K
- javascript - 无法使用 VueRouter 浏览我的不同路由器链接
- python - 将 Python 列表转换为单个字符串