regex 捕获正好n个字符的正则表达式模式,忽略r中较长的组

kqlmhetl  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(84)

我想从文件名中提取同位素编号。我要找的数字是223和224。但是这些可能在文件名中出现多次,尤其是作为日期的一部分。如何捕获223或224(或任何3个字符的字符串)并忽略它们(如果它们是更长的数字字符串的一部分)?
我试过这些和其他几个,但没有运气。

sub(".*(223|224).*", "\\1", "St1_224standard_20200223")
sub(".*([223|224]{3}).*", "\\1", "St1_224standard_20200223")
sub(".*([2|3|4]{3}).*", "\\1", "St1_224standard_20200223")

当我想要的是224时,我总是得到223。我知道我可以使目标数字成为字符串中的最后一个,但我对其他人使用的文件名没有影响。谢谢

goucqfw6

goucqfw61#

你可以用

sub(".*?(?<!\\d)(22[34])(?!\\d).*", "\\1", "St1_224standard_20200223", perl=TRUE)

参见R demo online
这里有几个关键点:

  • .*?在开始时用于匹配到达后续子模式的第一次出现所需的最少字符量
  • (?<!\d)/(?!\d)是定义数值边界的一对后向和前向
  • perl=TRUE使所有的工作,因为模式是一个PCRE兼容的模式(默认的TRE引擎不支持lookarounds)。

注意,我将223|224压缩为22[34],它更短,更有效。
也可以看到regex online demo

相关问题