R语言如何添加WHILE LOOP生成随机字符串直到匹配指定模式
问题根因
你现有代码返回NA有两个直接原因:
- 匹配目标写错:代码中
str_locate传入的匹配模式是"ADBC",和你要查找的"ABCD"不一致,因此字符串中存在ABCD时也无法匹配 - 字符串长度固定:固定生成100字符长度的随机串,存在小概率不包含目标模式的情况,自然返回NA
带while循环的修正代码
核心逻辑是在每次模拟迭代中,只要未检测到目标模式,就持续向字符串追加随机字符,直到匹配成功为止,从根本上避免NA值产生:
library(stringr) # 可调整的配置参数 target_pattern <- "ABCD" # 目标匹配模式 base_chars <- c("A", "B", "C", "D") char_prob <- c(0.25, 0.25, 0.25, 0.25) sim_times <- 100 # 模拟迭代次数 results <- list() for (i in 1:sim_times) { iter_id <- i # 初始化空字符串、空匹配结果 rand_str <- "" match_pos <- matrix(NA, nrow = 1, ncol = 2, dimnames = list(NULL, c("start", "end"))) # 循环生成字符直到匹配到目标模式 while (is.na(match_pos[1, "start"])) { # 每次追加10个随机字符平衡运行效率,可按需改成每次追加1个 new_seg <- paste(sample(base_chars, 10, replace = TRUE, prob = char_prob), collapse = "") rand_str <- paste0(rand_str, new_seg) match_pos <- str_locate(rand_str, target_pattern) } # 存储当前迭代结果 results[[i]] <- data.frame( iter_id, rand_str, first_start = match_pos[1, "start"], first_end = match_pos[1, "end"] ) } results_df <- do.call(rbind.data.frame, results)
代码说明
- 所有可调参数统一放在代码开头,后续修改匹配模式、字符概率、模拟次数时不需要改动循环逻辑
- while循环的终止条件为检测到目标模式的有效位置,保证每次迭代都能返回模式首次出现的索引,不会产生NA
- 每次追加10个字符是为了减少重复匹配的计算开销,如果需要逐字符生成的严格逻辑,把
sample函数里的采样数从10改成1即可 - 修正了原代码中匹配模式写错的问题,现在可以正确识别字符串中的ABCD序列
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

