在字符串末尾查找数字的同时,匹配字符串末尾的1-2位数字

时间:2019-12-08 20:22:01

标签: r regex regex-lookarounds stringr

我有一个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}$")

enter image description here

最初在名称中没有数字的算法工作得很好,但似乎与我试图对其进行负面查找的算法不兼容。

我尝试了一个积极的眼光,以了解这将如何影响匹配(知道它不适用于gamSpline34bagEarth8):

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

enter image description here

对于那些原始名称为数字的算法,这是最理想的选择,但是我不知道如何结合使用此正则表达式和从算法中获取原始名称中没有数字的数字。

我试图以某种方式将这两个正则表达式结合在一起,但不确定如何。我曾尝试在|([:digit:]{1,2}$)中加入辅助或正则表达式,但是匹配变得贪婪。

因此理想的匹配是:

enter image description here

1 个答案:

答案 0 :(得分: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"