【问题标题】:Matching 1-2 digits at end of string while lookbehinding pre-defined strings with digits匹配字符串末尾的 1-2 位数字,同时用数字查找预定义字符串
【发布时间】:2019-12-08 20:22:01
【问题描述】:

我有一个 ML 算法的字符向量,它的末尾附加了 1 或 2 位数字,我正在尝试匹配(并最终摆脱)。问题是我有一些算法,它们的原始名称中包含数字,我也想保留它们。例如svmLinear2C5.0

示例字符向量:

algs <- c("svmLinear234", "svmLinear25", "C5.05", "C5.053", "gamSpline34", "bagEarth8")

首先,我考虑加入一个否定的后视来逃避算法的字符串,这些算法的原始名称中有数字:

algs %>% 
  str_view_all("(?<!svmLinear2|C5.0)[:digit:]{1,2}$")

适用于最初名称中没有数字的算法,但似乎不适用于我试图消极寻找的算法。

我尝试了积极的回溯,看看这将如何影响匹配(知道它不适用于 gamSpline34bagEarth8):

algs %>% 
  str_view_all("(?<=svmLinear2|C5.0)[:digit:]{1,2}$")

这对于那些原始名称中有数字的算法非常有效,但我不知道如何将此正则表达式与从算法中捕获原始名称中没有任何数字的数字结合起来。

我试图以某种方式组合这两个正则表达式,但我不确定如何。我尝试使用 |([:digit:]{1,2}$) 包含辅助表达式或正则表达式,但匹配变得贪婪。

所以想要匹配的是:

【问题讨论】:

  • 如果你有一个相对较短的算法 ID 列表,匹配这些会更容易吗?
  • 不确定,如果我理解正确,但看看this demo 是否有帮助。
  • 给定示例的预期输出是什么?你有 G5W 假设的所有可能算法的列表吗?如果可以,可以分享一下吗?

标签: r regex regex-lookarounds stringr


【解决方案1】:

我假设您拥有所有可能算法的列表。将其放入我称为TrueNames 的列表中,然后在algs 中查找算法名称。

algs <- c("svmLinear234", "svmLinear25", "C5.05", "C5.053", 
    "gamSpline34", "bagEarth8")

TrueNames = c("svmLinear2", "C5.0", "gamSpline", "bagEarth")
Pat = paste(c(".*(", paste(TrueNames, collapse = "|"), ").*"), collapse="")

sub(Pat, "\\1", algs)

[1] "svmLinear2" "svmLinear2" "C5.0"       "C5.0"       "gamSpline" 
[6] "bagEarth" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 2013-11-12
    • 2018-12-05
    相关资源
    最近更新 更多