我有很多这样的字符串:
2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0
我想提取紧接在最后一个 "/"
之后并以 "_"
结尾的子字符串:
556662
我已经找到了如何提取:/01/01/07/556662
通过使用以下正则表达式:(\/)(.*?)(?=\_)
请告知我如何捕获正确的组。
最佳答案
你可以使用
x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"
这里,正则表达式匹配并输出第一个匹配的子串
.*/
- 任何 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 个或多个字符除了_
。
或者
stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"
这将在 /
之后提取除 _
和 /
之外的 1 个或多个字符组成的字符串的最后一个匹配项。
关于R 正则表达式捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54926083/