gpt4 book ai didi

r - 按条件应用 strsplit

转载 作者:行者123 更新时间:2023-12-05 03:24:11 24 4
gpt4 key购买 nike

我尝试应用以下规则:

; 截断字符串以达到最大长度 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com