【问题标题】:using regular expressions (regex) to make replace multiple patterns at the same time in R使用正则表达式(regex)在R中同时替换多个模式
【发布时间】:2020-04-04 19:07:27
【问题描述】:

我有一个字符串向量,我想同时从所有以 -ses 或 -ces 结尾的字符串(单词)中删除 -es。我想同时做而不是随之而来的原因是,有时会发生在删除一个结尾之后,另一个结尾出现,而我不想将此模式应用于单个单词两次。 我不知道如何同时使用两种模式,但这是我能做到的最好的:

text <- gsub("[sc]+s$", "[sc]", text)

我知道 替换 不正确,但我想知道如何表明我想用刚刚检测到的字母替换它(c s 在这种情况下)。提前谢谢你。

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    要删除单词末尾的es,即前面有sc,您可以使用

    gsub("([sc])es\\b", "\\1", text)
    gsub("(?<=[sc])es\\b", "", text, perl=TRUE)
    

    要在 strings 的末尾删除它们,您可以继续使用 $ 锚点:

    gsub("([sc])es$", "\\1", text)
    gsub("(?<=[sc])es$", "", text, perl=TRUE)
    

    第一个gsub TRE 模式是([sc])es\bcapturing group #1 匹配sc,然后匹配es,然后\b 确保下一个字符不是字母、数字或_。替换中的\1 是对存储在捕获组#1 内存缓冲区中的值的反向引用。

    在 PCRE 正则表达式的第二个示例中(由于 perl=TRUE),使用 (?&lt;=[sc]) positive lookbehind 代替 ([sc]) 捕获组。 Lookbehinds 不使用文本,它们匹配的文本不会落在匹配值中,因此无论如何都不需要恢复它。替换为空字符串。

    【讨论】:

      【解决方案2】:

      以“ces”和“ses”结尾的字符串遵循相同的模式,即“*es$”

      如果我理解正确的话,你不需要两种模式。

      示例: x = c("ces", "ses", "mes)

      gsub( pattern = "*([cs])es$", replacement = "\\1", x)

      [1] "c" "s" "mes"

      希望对你有帮助。

      M

      【讨论】:

      • 感谢您的回答。我想排除任何其他可能性,例如 -mes。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2022-01-17
      • 2012-02-12
      • 2015-02-21
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多