【问题标题】:gsub - reduce all repeating characters to one instancegsub - 将所有重复字符减少到一个实例
【发布时间】:2012-03-05 06:33:53
【问题描述】:

对大家来说一个有点奇怪的问题 - 我已经解决了我希望替换字符串中所有重复字符的问题,但我并不真正理解我的解决方案。例子是:

txt <- "haarbbbbbbijjjjjan"
gsub("([a-z])\\1+", "\\1", txt)
[1] "harbijan"

这只是匹配每个字母的所有重复实例(搜索词+搜索词的重复)并将它们替换为搜索到的字母吗?或者这是在做一些我没有完全理解的意外?

【问题讨论】:

    标签: regex r gsub


    【解决方案1】:

    您已经声明了一个组 - az 之间的任何符号。 \\1 引用该组。该组的任意数量的重复被代入组值。例如,如果组是a,那么任意数量的as 将被替换为组值,例如a

    希望我说清楚了 =)

    【讨论】:

    • 谢谢 - 解释很方便!
    • @Andrew Logninov,如果您想替换连续重复出现超过 2 次的字母,这将如何改变。例如,我想用r 替换rrr,但保持rr 不变?谢谢。
    • @Nestorghh 我不知道您使用的是什么语言,但总的来说,这应该看起来像这样:substitute('r{3,}', 'r', &lt;your_text&gt;)
    • @AndrewLogvinov 我正在使用R。但我刚刚意识到这段代码完成了gsub('([a-zA-Z]rrr*)\\1+', 'r', mytext) 的工作R 中的substitute 函数似乎执行其他任务。它应该以什么语言运行您的代码?非常感谢。
    • @Nestorghh 这是伪代码 :) 你应该试试gsub('r{3,}','r',text)
    【解决方案2】:

    如果你想替换至少出现 3 次的字母(例如),这是我的解决方案(使用 {2,}:

    gsub("([[:alpha:]])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
    #[1] "Buenna Suertee"
    

    如您所见,4“a”已缩减为仅 1 a,3 r 已缩减为 1 r,但 2 n 和 2 e 未更改。如上所述,您可以将 [[:alpha:]] 替换为 [a-zA-KM-Z] 或类似的任意组合,甚至使用“或”运算符 |如果您希望代码仅影响 y 和 Q 的重复,请在方括号 [y|Q] 内。

    gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee")
    # [1] "Buenna Suerrrtee"
    # triple r are not affected and there are no triple e.
    

    如果您想替换至少 n 次相同字符的重复,请使用{n-1,}。 如果您只想将 n 次重复替换为该字符的 2 次(例如),请在替换中使用 "\\1\\1"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 2021-10-27
      相关资源
      最近更新 更多