【问题标题】:R gsub partial replacement wildcardsR gsub 部分替换通配符
【发布时间】:2017-09-18 20:10:13
【问题描述】:

我希望这与之前的帖子有足够不同的相关性,以证明其自己的主题;不幸的是,它们对我没有帮助。我认为我对部分替换的兴趣,加上使用通配符到目前为止是独一无二的,但如果我没有足够仔细地搜索或阅读,请道歉!

假设我有以下字符串:

str <- c("FOO_1", "FOO_2", "BAR_1", "BAR_2")

我想将FOO_1 末尾的1 替换为其他内容,例如A。我试图对两者都这样做

gsub("[^F.*](1)$", "\\_A", str)

gsub("^F.*(1)$", "\\_BLAH", str)

但显然它们都没有替换1,保持FOO_ 的其余部分不变,同时也没有改变BAR_1。对于这个问题,我有一个愚蠢的解决方案,只涉及一行grep() 和一行gsub(),但如果我决定这样做,我会恨自己。

【问题讨论】:

  • 这里的规则是什么?只需替换字符串末尾的_1sub("_1$", "_A", x)?请参阅this demo - 是您要找的吗?
  • 很遗憾,没有;我想用FOO 替换变量starting,用1 替换ending。因此,例如,如果方法将BAR_1 更改为BAR_A,则表示失败。我只是想提供一个最小的工作示例,但在实际情况下,同一个变量有几个排列。例如,FOO_A_1FOO_B_1 等;我想捕获所有^FOO.*1$(如果表述不正确,请见谅)。
  • 这需要扩展吗?您是否只想将FOO_1 替换为FOO_A
  • 刚刚经过测试,@WiktorStribiżew 的回答似乎足以满足我的目的。非常感谢!抱歉打扰了。

标签: r regex gsub


【解决方案1】:

我只想将变量 starting 替换为 FOO 并将 ending 替换为 1

FOO 及其后的所有内容捕获到第1 组中,并在字符串末尾匹配_1。然后,在替换模式中,使用对 Group1 值的替换反向引用:

str <- c("FOO_1", "FOO_2", "BAR_1", "BAR_2")
sub("^(FOO.*)_1$", "\\1_A", str)
## => [1] "FOO_A" "FOO_2" "BAR_1" "BAR_2"

this R demo

如果必须匹配字符串末尾的任何数字量,请将1 替换为\\d+

详情

  • ^ - 字符串开始
  • (FOO.*) - FOO 子字符串,然后是任何 0+ 字符,尽可能多
  • _1 - _1 子字符串(如果将 1 替换为 \\d+,它将匹配 1 个或多个数字)
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多