我試圖應用以下規則:
將字串截斷;以達到最大長度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"。但是,next Chop 的長度超過了 4,并且我們已經;存在于字串中。因此,我們砍了;。
目前,我可以or通過使用Regex.
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)。
有人對此有解決方案嗎?謝謝你。
uj5u.com熱心網友回復:
您的正則運算式匹配 asplitvar或前面至少有任何num字符的位置。
您尋求的模式是一個正則運算式,匹配任何一個、兩個或三個字符,然后是一個splitvar或num除splitvarchar 之外的任何字符。
所以,你可以使用
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 演示。請參閱正則運算式演示。
詳情:
.{1,3}(?:;|$)stringr-盡可能多的一個、兩個或三個字符(如果使用 ,則換行符除外),然后是一個;字符或字串結尾|- 或者[^;]{4}- 除字符外的任何四個字符;。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/480415.html
