【问题标题】:Specify the number of characters to be matched using a variable使用变量指定要匹配的字符数
【发布时间】:2013-03-27 16:44:38
【问题描述】:

我正在使用以下表达式来提取字符串的一部分:

part <- sub("(^[a-zA-Z]{2}).*$", "\\1", "My String", perl = T)

产生

"My"

问题是我想使用一个变量来指定表达式中的重复次数,因此而不是有

^[a-zA-Z]{2} 

我想要

^[a-zA-Z]{var}

var <- 2

part <- sub("(^[a-zA-Z]{var}).*$", "\\1", "My String", perl = T)

产量

"My String"

代替

"My"

我怎样才能调整这个表达式,使 var 可以读作 2 而不是 “var”?我将不胜感激任何帮助。

【问题讨论】:

    标签: regex r text-extraction


    【解决方案1】:

    我喜欢为此使用sprintf。如果var 不是数字,则会引发错误。

    var <- 2
    pat <- "(^[a-zA-Z]{%d}).*$"
    pat <- sprintf(pat, var)
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      part <- sub(paste(sep="","(^[a-zA-Z]{",var,"}).*$"), "\\1", "My String", perl=T)
      

      【讨论】:

      • 感谢您的及时回复。也许我错过了一些东西,但它不起作用。 paste("(^[a-zA-Z]{",var,"}).*$") 返回 paste("(^[a-zA-Z]{ 2 }).*$") 注意空格在 { 2 }
      • @user1913361,对不起,您必须添加sep=""
      【解决方案3】:

      如果我们在 gsubfn 包中的命令前面加上 fn$,那么我们可以使用 $var 来引用要替换的变量:

      library(gsubfn)
      var <- 2
      fn$sub("(^[a-zA-Z]{$var}).*$", "\\1", "My String")
      

      或者使用同一个包中的strapplyc,这样可以简化正则表达式:

      fn$strapplyc("My String", "^[a-zA-Z]{$var}", simplify = TRUE)
      

      我认为这只是一个例子,真正的问题更复杂,但如果这是真正的问题,那么它会更容易并且可能足以使用substring

      var <- 2
      substring("My String", 1, var)
      

      【讨论】:

      • 谢谢!这也很有效。我会仔细看看 gsubfn 库。
      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 2011-03-11
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多