R正则表达式匹配/省略多次重复

标签 r regex

我使用反向引用来消除变量名称向量中的意外重复。我遇到的第一个案例中的名称有这样的重复模式

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/

相关文章:

r - 如何在ggplot2图例中包含黄土线?

r - 使用R映射博客之间的链接网络?

javascript - 正则表达式匹配字符串直到空格 Javascript

html - Picturefill 是否会因为使用 RegEx 获取正确的图像而减慢客户端的浏览器速度?

c# - 如何替换前导空格但保留多行?

r - 快速建立参数组合模型

r - 在 pdf、单个表、r 中解析跨多个页面的表

regex - AS3正则表达式问题

rcpp 一个文件中有多个函数且没有匹配的函数

javascript - Javascript的跨浏览器正则表达式库,使用函数替换