带有正则表达式反转的 stringr 包 str_extract()

stringr package str_extract() with inversion of the regex

我有如下字符串: 14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27.0

以下正则表达式提取以点和数字结尾的最后部分。我想提取除那部分以外的所有内容,但似乎无法找到反转正则表达式的方法(使用 ^)无济于事:

> s <- '14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27.0'
> str_extract(s, '(\.[0-9]{1})$')
[1] ".0"

我希望输出为:

[1] 14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27

为了进一步澄清,我希望它 return 原样的字符串,如果它不是以点和一位数字结尾的话。

以下示例:

> s <- '14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27'
> str_extract(s, someRegex)
[1] "14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27"
> s <- '14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27.1'
> str_extract(s, someRegex)
[1] "14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27"
> s <- '14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27.4'
> str_extract(s, someRegex)
[1] "14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27"
str_extract(s, ([\w ]+(?:\.|\-)){7})

然后你可以访问返回的字符串到它的长度-1,它会给你所需的输出!

PS:您可能需要使用转义字符。

试试这个正则表达式:

^.*(?=\.\d+$)|^.*

Regex live here.

一个选项是替换最后一位,

sub("\.\d$", '', s)

您可以使用 stringr::str_remove() 例如:

s <- '14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27.0'
stringr::str_remove(s, '(\.[0-9]{1})$')
#> [1] "14ed0d69fa2.bbd.7f5512.filter-132.21026.55B67C8E27"