我尝试应用以下规则:
按 ;
截断字符串以达到最大长度 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/