R语言stringr::str_extract_all正则匹配多字符后缀问题求解
R语言stringr正则提取多字符后缀条目解决方案
原有正则错误原因
你之前写的'A_([A-Z][0-10])[\w+]'存在两个语法错误,导致结果不符合预期:
- 字符组
[]仅支持单字符匹配规则,[0-10]实际只会匹配0、1两个单字符,无法匹配数字9、两位数字10 [\w+]同样是字符组逻辑,仅匹配单个字符(单词字符或加号本身),因此只会抓取后缀的第一个字符o、t,返回错误的A_K9o,A_K9t
正确正则写法
针对你要提取A_开头、大写字母+数字(支持10这类两位数字)、后续跟2个及以上小写字母(即one/two类多字符单词后缀)条目的需求,正确正则为:
A_[A-Z](?:[1-9]|10)[a-z]{2,}
正则各部分含义:
A_:匹配固定前缀[A-Z]:匹配K、U这类跟在A_后的单个大写字母(?:[1-9]|10):非捕获组,匹配1-9的单个数字,或两位数字10,覆盖所有数字序号场景[a-z]{2,}:匹配2个及以上连续小写字母,刚好对应多字符单词后缀,不会匹配单字符大写后缀的条目(比如A_K9B)
R语言实现代码
配合你使用的dplyr::mutate、purrr::map_chr流程,完整代码如下:
library(tidyverse) # 构造示例数据 x <- tibble(V1 = "(A_K9B,A_K9one,A_K9two,B_U10J)") # 提取两列结果 x <- x %>% mutate( # 原单大写字母后缀列,修正数字匹配逻辑后结果和预期一致 N_alph = str_extract_all(V1, "A_[A-Z](?:[1-9]|10)[A-Z]") %>% map_chr(~paste(.x, collapse = ",")), # 多字符单词后缀列,返回预期结果 N_all.words = str_extract_all(V1, "A_[A-Z](?:[1-9]|10)[a-z]{2,}") %>% map_chr(~paste(.x, collapse = ",")) )
运行后输出结果:
- N_alph列值:
A_K9B - N_all.words列值:
A_K9one,A_K9two
该写法无需逐字符罗列后缀,后续如果出现A_K9three、A_K9four等其他多字符小写后缀的条目,也可以自动匹配,不需要修改正则。
内容的提问来源于stack exchange,提问作者Nnnz
相关产品推荐
相关产品推荐

