【问题标题】:unexpected behavior in pmatch while matching '+' in R匹配 R 中的“+”时 pmatch 出现意外行为
【发布时间】:2013-11-14 12:53:01
【问题描述】:

我正在尝试使用 pmatch 函数匹配字符串中的“+”符号。

目标 = “18+”

pmatch("+",目标)

[1] 不适用

如果我也使用 match 或 grepl,我会观察到类似的行为。 如果我尝试使用 gsub,我会得到以下输出。

gsub("+","~",目标)

[1] "~1~8~+~"

有人可以解释一下这种行为的原因以及我的问题的可行解决方案

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一场前瞻性的比赛。所以它尝试将"+" 匹配到table 中所有元素的第一个字符(pmatch 的第二个参数)。这失败了("+" != "1"),所以返回了NA。您还必须注意pmatch 的返回值。我要引用帮助,因为它比我以往任何时候都更简洁和更好地解释它......

    精确匹配优于部分匹配(要匹配的值与目标的初始部分完全匹配,但目标更长)。

    如果存在单个完全匹配或没有完全匹配且唯一 部分匹配则返回匹配值的索引;如果 找到多个完全匹配或多个部分匹配,然后 0 是 返回,如果没有找到匹配,则返回 nomatch。

    ###Examples from ?pmatch###
    #  Multiple partial matches found - returns 0
    charmatch("m",   c("mean", "median", "mode")) # returns 0
    
    #  One exact match found - return index of match in table
    charmatch("med", c("mean", "median", "mode")) # returns 2
    
    #  One exact match found and preferred over partial match - index of exact match returned
    charmatch("med", c("med", "median", "mode")) # returns 1
    

    要在您的字符串中获得与"+" 匹配的向量,我会使用grepl...

    Target <- c( "+" , "+18" , "18+" , "23+26" , "1234" )
    grepl( "\\+" , Target )
    # [1]  TRUE  TRUE  TRUE  TRUE FALSE
    

    【讨论】:

      【解决方案2】:

      试试这个:

      gsub("+","~",fixed=TRUE,Target)

      ?gsub

      固定 - 合乎逻辑。如果为 TRUE,pattern 是要按原样匹配的字符串。 覆盖所有冲突的参数。

      【讨论】:

      • 可能还提到您可以转义+gsub("\\+","~",Target),因为+ 在正则表达式中表示某些东西
      • 好的,通过这个我可以用'~'字符替换'+'符号。但是,如果我使用 ~ 符号作为匹配模式,我仍然无法让它与 match、pmatch 或 grepl 一起使用。我真的很想知道为什么会这样。但目前我可以继续我的工作,我将用字符串替换“+”符号并匹配它。我知道这不是编写代码的最佳方式,如果有人可以解释为什么我无法匹配字符串中的特殊字符。那太好了。谢谢:)
      • @MayankBansal 我对pmatch 一无所知,但gsubgrepl 使用正则表达式,在正则表达式中+ 是一个特殊字符,表示匹配1 或更多。要转义 + 并让它找到文字 +,请在其前面添加 \\
      • @JakeBurkhead 但fixed = TRUE 表示不要将模式视为正则表达式。
      • @Jake - 在 grepl 中使用它 \\ 运算符有效。感谢 pmatch 和 match 的行为不同,我不知道为什么
      【解决方案3】:

      函数pmatch() 尝试匹配开始元素,而不是元素的中间部分。因此,问题与加号 + 无关。因此,例如,pmatch() 的前两次执行给出NA 作为结果,接下来的三个给出1 作为结果(表示匹配第一个元素的开头)。

      Target <- "18+"
      pmatch("8", Target)
      pmatch("+", Target)
      pmatch("1", Target)
      pmatch("18", Target)
      pmatch("18+", Target)
      

      函数gsub() 可用于使用正则表达式匹配和替换部分元素。加号在正则表达式中具有特殊含义,因此需要使用转义字符来表示您对加号作为单个字符感兴趣。例如,以下三行代码分别给出"1~+""18~""~"作为结果。

      gsub("8", "~", Target)
      gsub("\\+", "~", Target)
      gsub("18\\+", "~", Target)
      

      【讨论】:

      • -1 函数 pmatch() 尝试匹配元素,而不是元素的一部分。这显然是不正确的。 pmatch("1", "18+").
      • 没错,@SimonO101。我编辑了我的帖子以尝试澄清并合并您的示例。谢谢。
      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多