我使用反向引用来消除变量名称向量中的意外重复。我遇到的第一个案例中的名称有这样的重复模式
x <- c("gender_gender-1", "county_county-2", "country_country-1997",
"country_country-1993")
重复项始终用下划线分隔,并且只有一个重复项需要消除。它们总是从文本的开头开始。在检查了正则表达式食谱 2ed 后,我得到了一个有效的答案:
> gsub("^(.*?)_\\1", "\\1", x)
[1] "gender-1" "county-2" "country-1997" "country-1993"
我担心 future 的情况可能会有破折号或空格作为分隔符,所以我想概括一下匹配。我也解决了。
> x <- c("gender_gender-1", "county-county-2", "country country-1997",
+ "country,country-1993")
> gsub("^(.*?)[,_\ -]\\1", "\\1", x)
[1] "gender-1" "county-2" "country-1997" "country-1993"
到目前为止,完全胜利。
现在,如果在某些情况下出现三个重复,正确的解决方法是什么?在这一篇中,我希望“国家-国家-国家”成为一个“国家”。
> x <- c("gender_gender-1", "county-county-county-2")
> gsub("^(.*?)[,_\ -]\\1", "\\1", x)
[1] "gender-1" "county-county-2"
如果这样可以更轻松地消除重复单词,我愿意用“_”替换所有分隔符。
最佳答案
您可以量化[,_ -]\1
部分:
gsub("^(.*?)(?:[,_\\s-]\\1)+", "\\1", x, perl=TRUE)
请参阅R demo
注意,我还将空格替换为 \s
以匹配任何空格(这需要 perl=TRUE
)。您还可以使用 [:space:]
匹配任何空格,则不需要 perl=TRUE
,即 gsub("^(.*?)( ?:[,_[:空格:]-]\\1)+", "\\1", x)
。
详细信息:
^
- 匹配字符串的开头(.*?)
- 任何 0+ 个字符,尽可能少到第一个...(?:
[,_\\s-]
-、
、_
、空格或-
\\1
- 与组 1 中捕获的值相同
)+
- 1 次或多次。
如果您只想匹配重复部分 1 或 2 次,请将 +
替换为 {1,2}
限制量词:
gsub("^(.*?)(?:[,_\\s-]\\1){1,2}", "\\1", x, perl=TRUE)
关于R正则表达式匹配/省略多次重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43711240/