【问题标题】:How to include object in regular expression如何在正则表达式中包含对象
【发布时间】:2012-08-31 02:48:35
【问题描述】:
namez <- c("foo2003", "bar2340", "naught45")
patternz <- "03"
grepl("[patternz]$",namez)

它不起作用。我应该用什么替换 [patternz],所以正则表达式将匹配 patternz 变量的内容?

[edit]注意我要匹配字符串“03”,而不是分别匹配数字“0”和“3”。

【问题讨论】:

  • @shhhhimhuntingrabbits,可读性胜过性能的小幅提升。这就是我选择您的解决方案的原因。但我会选择 Gavin 的那个,因为除了使用标准库之外,它还在变量内部而不是围绕它创建正则表达式。这是非常简单和优雅的。

标签: regex r object


【解决方案1】:

必须承认自己很难找到问题所在。举例说明无非就是

R> namez <- c("foo2003", "bar2340", "naught45")
R> patternz <- "03"
R> grepl(patternz, namez)
[1]  TRUE FALSE FALSE

是必需的,因为patternz 一个字符向量,目的不是匹配0 & 3,而是匹配文字"03"

如果您只需要在字符串末尾匹配,那么我们需要手动添加"$"

R> patternz2 <- "03$"
R> grepl(patternz2, namez)
[1]  TRUE FALSE FALSE

或通过paste0() 操作

R> grepl(paste0(patternz, "$"), namez)
[1]  TRUE FALSE FALSE

问题是使用 patternz 作为实际的正则表达式和基本 R 函数完美地处理这个问题。

【讨论】:

  • 我知道,但 SO 不是静态网站,似乎没有人愿意更新他们的答案以匹配发展中的讨论。
  • @GavinSimpson 我认为允许整夜睡觉?我在澳大利亚!在那里,帖子已编辑。 :)
  • @DanielMachado 睡觉?这在这里令人不悦。需要明确的是,您应该接受任何您想要且最适合您的答案。其他答案在这里是为其他有类似问题的人准备的。如果您对最初的接受感到满意,请坚持下去。投票和接受是两个不同的东西。
【解决方案2】:

看起来您需要为grepl() 创建一个字符向量,使用paste0() 似乎可行,但不是那么优雅:

> grepl(paste0("[", patternz, "]$"), namez)
[1]  TRUE  TRUE FALSE

【讨论】:

  • 等一下。为什么要输入“[”/“]”?
  • @DWin - 我显然误解了 OP 的问题,表示他的字符串“03”应该匹配为一个字符类。我猜他是在使用[] 试图告诉 R 应该寻找一个名为patternz的对象。
【解决方案3】:

包裹gsubfn是你的朋友

library(gsubfn)
namez <- c("foo2003", "bar2340", "naught45")
patternz <- "03"
fn$grepl("[$patternz]$",namez)

#> fn$grepl("[$patternz]$",namez)
#[1]  TRUE  TRUE FALSE

最初您表示要匹配字符串末尾的 0 或 3。在您的评论中,您提到在这种情况下可能想要匹配“03”

fn$grepl("$patternz$",namez)

会更合适。

还有

fn$grepl("`patternz`$",namez)

在这种情况下可能更合适,因为$ 具有双重含义。

【讨论】:

  • 不错的@ttmaccer,但我期待的结果是真假假。知道如何实现吗?
  • 'gsubfn' 包很牛逼,但在这里有点矫枉过正。
  • 我想当提问者高兴的时候是合适的,在此基础上我认为它是合格的。
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多