r语言 - 在第一个方括号内提取



我知道有一些类似的问题,但它们对我没有帮助,可能是因为我缺乏对字符串操作基础知识的理解。

我有一根绳子,我想从它的第一个方括号内侧提取出来。

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"

我已经在互联网上查看了以下代码,但它给了我第二个括号内

sub(".*\[(.*)\].*", "\1", x, perl=TRUE)

代码返回2。我预计得到4

如果有人指出缺失的部分,将不胜感激。

----更新----

在前两个实例中将.*替换为.*?有效,但不知道如何。我将这个问题留给可以提供为什么有效的人:

sub(".*?\[(.*?)\].*", "\1", x, perl=TRUE)

你快到了:

sub("^[^\]]*\[(\d+)\].*", "\1", x, perl=TRUE)
## [1] "4"

最初的问题是.*在匹配之前尽可能多地匹配任何东西[.您的解决方案是*?这是*(不贪婪,不情愿(匹配的懒惰版本,尽可能少。

完全有效,我使用的另一种选择是[^\]]*:它将任何不]的东西转换为匹配。

stringr

您可以使用基本 R 解决此问题,但在处理此类"问题"时,我通常更喜欢stringr包中的函数。

x <- "cons/mod2/det[4]/rost2/rost_act[2]/Q2w5"

如果只想使用括号之间的第一个字符串,请使用str_extract

stringr::str_extract(x, "(?<=\[).+?(?=\])")
# [1] "4"

如果要将所有字符串都放在括号之间,请使用str_extract_all

stringr::str_extract_all(x, "(?<=\[).+?(?=\])")
# [[1]]
# [1] "4" "2" 

最新更新