r - 按条件应用 strsplit

标签 r regex strsplit

我尝试应用以下规则:

; 截断字符串以达到最大长度 n

例如,

n <- 4
string <- c("a;a;aabbbb;ccddee;ff")
output <- c("a;a;", "aabb", "bb;", "ccdd", "ee;", "ff")

对于"aabb",由于截取长度"aabbbb"超过n = 4,因此我们按长度截取, 4

对于 "bb;",由于截断长度 "bb;" < 4,我们接下来考虑 "bb;ccddee"。但是,下一个chop的长度超过了4,字符串中已经有;了。因此,我们按 ; 进行分割。

目前,我可以通过Regex实现or

num <- 4
splitvar <- ";"

## splits pattern
pattern <- paste0("(?<=.{", num, "}|", splitvar, ")")

> pattern
[1] "(?<=.{4}|;)"

string <- c("a;a;aabbbb;ccddee;ff")
strsplit(string, pattern, perl = TRUE)
[[1]]
[1] "a;"   "a;"   "aabb" "bb;"  "ccdd" "ee;"  "ff"  

如您所见,我们实际上不需要截断 "a;""a;",因为长度不会超过 n(2 + 2 = 4)。

有人对此有解决方案吗? 谢谢。

最佳答案

您的正则表达式匹配 splitvar 或前面至少有任何 num 个字符的位置。

您寻找的模式是一个正则表达式匹配任何一个、两个或三个字符,然后是一个 splitvar 或除 splitvar 之外的任何 num 个字符> 字符。

所以,你可以使用

num <- 4
splitvar <- ";"
pattern <- paste0(".{1,", num-1, "}(?:",splitvar,"|$)|[^",splitvar,"]{",num,"}")
pattern ## => .{1,3}(?:;|$)|[^;]{4}
string <- c("a;a;aabbbb;ccddee;ff")
unlist(regmatches(string, gregexpr(pattern, string)))
## => "a;a;" "aabb" "bb;"  "ccdd" "ee;"  "ff" 

使用stringr:

library(stringr)
unlist(str_extract_all(string, pattern))

参见 R demo online .查看regex demo .

详细信息:

  • .{1,3}(?:;|$) - 一个、两个或三个字符(如果使用 stringr,换行符除外)作为尽可能多,然后是 ; 字符或字符串结尾
  • | - 或者
  • [^;]{4} - 除 ; 字符外的任意四个字符。

关于r - 按条件应用 strsplit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72345568/

相关文章:

r - 在 R 中,如何拆分向量中的每个字符串以返回第 N 个字符实例之前的所有内容?

r - R中字符串的类字典匹配

r - 如何获得给定包所需的最低 R 版本?

regex - 正则表达式 - 匹配所有单词但只匹配唯一单词一次

R:我的数据框有 2 列,每行都有一串数字,有没有办法拆分字符串并添加每列的值?

Php Regex - 如何选择是否等于某物

Java正则表达式

r - 为什么数字 1e9999...(31 个 9)会在 R 中引起问题?

r - 使用ggplot2用百分比绘制多个数据集的直方图

eclipse - 使用 Sweave 和 R 在 Eclipse 中构建项目命令