R正则表达式捕获组?

R正则表达式捕获组?,r,regex,string,R,Regex,String,我有很多这样的字符串: 2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0 我想提取位于最后一个“/”之后并以结尾的子字符串: 我已经找到了如何提取:/01/01/07/556662 通过使用以下正则表达式:(\/)(.*)(=\\\) 请告知如何捕获正确的组。您可以使用捕获组: /([^_/]+)_[^/\s]* 解释 /逐字匹配 ([^/]+)在不匹配下划线或正斜杠的组中捕获 \u[^/\ s]*匹配\u,然后0+次不是正

我有很多这样的字符串:

2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0
我想提取位于最后一个
“/”
之后并以
结尾的子字符串:

我已经找到了如何提取:
/01/01/07/556662

通过使用以下正则表达式:
(\/)(.*)(=\\\)


请告知如何捕获正确的组。

您可以使用捕获组:

/([^_/]+)_[^/\s]*
解释

  • /
    逐字匹配
  • ([^/]+)
    在不匹配下划线或正斜杠的组中捕获
  • \u[^/\ s]*
    匹配
    \u
    ,然后0+次不是正斜杠或空白字符
|

获取捕获组的一个选项可能是使用str_match获取第二列:

library(stringr)
str = c("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0")
str_match(str, "/([^_/]+)_[^/\\s]*")[,2]

# [1] "556662"
你可以用

x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"
library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"

在这里,它与前一个类似,但是除了
\uuu
之外的1个或多个字符被捕获到组1中(
\1
在替换模式中),并且尾部的
*
确保整个输入匹配(并且已消耗,准备替换)

替代非基本R解决方案

如果您负担得起或更愿意使用
stringi
,您可以使用

x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"
library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"
这将匹配到最后一个
/
的字符串,并将捕获到组1(您使用
[,2]
在第2列中访问该组)1个或多个字符,而不是
\uu


stri_extract_u last_regex(“2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0”)(I根据Wiktor Stribiżew的代码更改了regex规则

x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/([0-9]+)", x, perl=TRUE))
sub(".*/([0-9]+).*", "\\1", x)

x这不是我需要的,我想提取第一个捕获组中位于最后/和之前的任何内容。我已经更新了我的答案。但是在位于最后/和之前的子字符串之后我不需要任何内容。我如何提取我需要的唯一部分。非常简单,直截了当注意!谢谢Wiktor!!!@Wiktor-stribizew@SteveS我还添加了非base R正则表达式解决方案。请注意,OP在帖子中没有提到,在最后一个
/
之后和下一个
\u
之前,应该只有数字。
x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/([0-9]+)", x, perl=TRUE))
sub(".*/([0-9]+).*", "\\1", x)