【问题标题】:Pattern matching and replacement in RR中的模式匹配和替换
【发布时间】:2013-11-26 14:07:34
【问题描述】:

我对正则表达式一点也不熟悉,想在R中做模式匹配和替换。

我想将向量original = c("#1", "#2", "#10", "#11")中的模式#1#2替换为向量vec = c(1,2)的每个值。

我正在寻找的结果是以下向量:c("1", "2", "#10", "#11") 我不知道该怎么做。我试着做:

for(i in 1:2) {
    pattern = paste("#", i, sep = "")
    original = gsub(pattern, vec[i], original, fixed = TRUE)
}

但我明白了:

#> original
#[1] "1"  "2"  "10" "11"

而不是:"1" "2" "#10" "#11"

如果能得到任何帮助,我将不胜感激!谢谢!

【问题讨论】:

    标签: regex r gsub


    【解决方案1】:

    指定要匹配从开始 (^) 到结束 ($) 的整个字符串。

    在这里,我已经完全匹配了您在此示例中查看的条件,但我猜您需要扩展它:

    > gsub("^#([1-2])$", "\\1", original)
    [1] "1"   "2"   "#10" "#11"
    

    所以,基本上,“从一开始,寻找一个哈希符号,后跟确切的数字一或二。一或二应该只是一个数字(这就是我们不使用 * 或 @ “

    【讨论】:

    • 谢谢!你能解释一下"\\1"是什么意思吗?这与vec = c(1,2) 中的替换值有什么关系?非常感谢
    • 比你。认为我的例子非常简单。但是,在我的实际情况中,我需要明确使用 vec 向量的值进行替换,而不仅仅是删除 # 符号。你能概括一下这个公式吗?
    • @AnandaMahto 所以“捕获”是() 而“反向引用”是"\\1"
    • @zx8754,要上公共汽车了,所以我要躲起来,只是 share a link 这可能比我能解释得更好:-)
    • @AnandaMahto 非常有帮助!非常感谢!
    【解决方案2】:

    另一个使用gsubfn的选项:

    library(gsubfn)
    gsubfn("^#([1-2])$",  I, original)   ## Function substituting
    [1] "1"   "2"   "#10" "#11"
    

    或者如果你想显式使用你的 vector 的值,使用 vec 值:

    gsubfn("^#[1-2]$",  as.list(setNames(vec,c("#1", "#2"))), original) 
    

    或公式表示法等价于函数表示法:

    gsubfn("^#([1-2])$",  ~ x, original)   ## formula substituting
    

    【讨论】:

    • 谢谢!!但是由于某种原因,当我尝试使用表达式"^#1$" 替换模式#1 时,它不起作用!我很困惑..
    • 这是我为 #1 尝试过的:gsub(paste("^#", i, "$", sep = ""), 1, original)gsubfn(paste("^#", i, "$", sep = ""), 1, original),但没有一个工作:S
    • gsubfn("^#([1-2])$", I, original) I 这里是“大写字母 i”作为 Identity not 1。
    • 现在可以使用了!!出于某种原因,我的向量中有一个额外的空间把事情搞砸了!!非常感谢!
    【解决方案3】:

    这是一个稍微不同的拍摄,它使用了零宽度负前瞻断言(真是拗口!)。这是(?!...),它匹配字符串开头的#,只要它后面没有... 中的任何内容。在这种情况下,两个(或等效地,只要它们是连续的)数字。它什么都没有。

    gsub( "^#(?![0-9]{2})" , "" , original , perl = TRUE )
    [1] "1"   "2"   "#10" "#11"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2023-04-11
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多