R如何从逗号分隔字符串中提取无多余空格的唯一子串
逗号分隔字符串提取无空格唯一子串的正则优化方案
需求与示例数据
需要将逗号分隔的字符串处理为无多余空格的唯一子串,使用的示例数据如下:
x <- c("Anna & x, Anna & x", # "Alb, Berta 222, Alb", "Al Pacino", "Abb cd xy, Abb cd xy, C123, C123, B")
原有实现的问题
最初通过否定字符类、否定前瞻、反向引用组合的正则实现了去重逻辑,但提取的子串包含不需要的前置空格,运行代码与返回结果如下:
library(stringr) str_extract_all(x, "([^,]+)(?!.*\\1)")
返回结果:
[[1]] [1] " Anna & x" [[2]] [1] " Berta 222" " Alb" [[3]] [1] "Al Pacino" [[4]] [1] " Abb cd xy" " C123" " B"
期望得到的无空格结果如下:
#> [[1]] #> [1] "Anna & x" #> [[2]] #> [1] "Alb" "Berta 222" #> [[3]] #> [1] "Al Pacino" #> [[4]] #> [1] "Abb cd xy" "C123" "B"
优化方案
原正则的问题在于[^,]+会将逗号后的前置空格也纳入匹配范围,只需要在匹配起始位置增加非空格的限制即可,优化后的正则写法如下:
str_extract_all(x, "((?!\\s)[^,]+)(?!.*\\1)")
正则逻辑说明:
(?!\\s)为否定前瞻规则,要求匹配起始位置的下一个字符不能是空格,从根源避免提取到前置空格[^,]+匹配所有非逗号的连续字符,作为单个子串的内容(?!.*\\1)为去重逻辑的否定前瞻,确保当前匹配的子串不会在后续内容中重复出现,最终仅返回每个字符串中的唯一子串
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

