R语言:如何简化多可选子串的统一编码与顺序调整流程?
嘿,我懂你想简化排序之后那堆繁琐步骤的心情——原来两次排序加两次去下划线确实有点冗余,咱们可以把这些流程合并得更高效!
优化思路
核心是用一次正则分组替换完成排序,再用一次正则搞定所有下划线问题,把原来的4步压缩到2步:
- 合并排序操作:通过正则捕获
eye标识(_r_/_l_)、test标识(_test_)以及前后的其他内容,直接重新排列顺序,把eye和test移到最前面。 - 合并下划线处理:用一个正则同时移除首尾下划线、合并连续的多下划线,不用分步处理。
优化后的代码
# 保留你原来的统一编码步骤(这一步的下划线是为了匹配唯一性,很合理) clean_test<- gsub("(?<![a-z])(test|method)(?![a-z])", "_test_", tolower(x), perl = TRUE) clean_r <- gsub("(?<![a-z])(r|re)(?![a-z])", "_r_", tolower(clean_test), perl = TRUE) clean_l <- gsub("(?<![a-z])(l|le)(?![a-z])", "_l_", tolower(clean_r), perl = TRUE) # 优化:一步完成排序,把eye、test移到前面,其余内容跟进 sorted <- gsub("^(.*?)(_r_|_l_)(.*?)(_test_)(.*)$", "\\2\\4\\1\\3\\5", clean_l, perl = TRUE) # 优化:一步处理所有下划线问题 result <- gsub("^_|_$|_{2,}", "", sorted) # 查看结果 result #> [1] "id" "r_test" "l_test" "r_test" "l_test" #> [6] "r_test_old" "l_test_old" "r_test_new" "l_test_new" "r_test_new"
正则逻辑拆解
排序正则:
^(.*?)(_r_|_l_)(.*?)(_test_)(.*)$^(.*?):匹配eye标识前的所有内容(非贪婪模式,避免误吞eye标识)(_r_|_l_):捕获统一后的eye标识(分组2)(.*?):匹配eye和test之间的内容(非贪婪)(_test_):捕获统一后的test标识(分组4)(.*)$:匹配test标识后的所有内容- 替换为
\\2\\4\\1\\3\\5,就是把eye→test→其他内容的顺序固定下来。
下划线处理正则:
^_|_$|_{2,}^_|_$:匹配字符串首尾的下划线_{2,}:匹配2个及以上的连续下划线- 把这些匹配到的内容全部替换为空,一次搞定所有下划线问题。
如果想更紧凑,还可以把排序和下划线处理合并成一行:
result <- gsub("^_|_$|_{2,}", "", gsub("^(.*?)(_r_|_l_)(.*?)(_test_)(.*)$", "\\2\\4\\1\\3\\5", clean_l, perl = TRUE))
这样既保留了原逻辑的准确性,又大幅简化了代码,可读性也更强~
内容的提问来源于stack exchange,提问作者tjebo
相关产品推荐
相关产品推荐

