R正则表达式捕获组?

时间:2019-02-28 12:45:22

标签: r regex string

我有很多这样的字符串:

2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0

我想提取位于最后一个"/"之后并以"_"结尾的子字符串:

556662

我发现了如何提取:/01/01/07/556662

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用

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

请参见regexR demo

在这里,正则表达式匹配并输出匹配的第一个子字符串

  • .*/-直到最后一个/为止的任意0个以上的字符
  • \K-在比赛中省略了这一部分
  • [^_]+-将_以外的1个或多个字符放入匹配值。

或者,一个sub解决方案:

sub(".*/([^_]+).*", "\\1", x)

请参见regex demo

在这里,它与上一个相似,但是将_以外的1个或多个字符捕获到组1(替换模式中的\1),并且末尾的.*确保整个输入都匹配(并且已消耗,可以替换)。

可选的非基础R解决方案

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

library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"

这将匹配直到最后一个/的字符串,并将捕获到组1(您使用[,2]在第2列中访问)除_以外的1个或更多字符。< / p>

stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"

这将提取一个字符串的最后一个匹配项,该字符串由_之后的//以外的1个或多个字符组成。

答案 1 :(得分:1)

您可以使用捕获组:

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

说明

  • /字面上匹配
  • ([^_/]+)捕获不匹配下划线或正斜杠的组
  • _[^/\s]*匹配_,然后匹配0+次不是正斜杠或空格字符

Regex demo | R demo

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

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

# [1] "556662"

答案 2 :(得分:0)

我根据WiktorStribiż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)

输出

[1]“ 2019/01/01/07/556662”

[1]“ 556662”

R demo