我有很多这样的字符串:
2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0
我想提取最后一个斜杠后面以及以"_"结尾的子字符串:
Original Answer
翻译成 "最初的回答"。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
- 省略此部分的匹配结果。[^_]+
- 将一个或多个不为_
的字符放入匹配值中。sub
方法来解决:sub(".*/([^_]+).*", "\\1", x)
请参见正则表达式演示。
这里与前一个示例类似,但除了_
之外的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]
在第二列中访问该组),该组中包含一个或多个字符,但不包括_
。stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"
这将提取一个由除了_
和/
之外的1个或多个字符组成的字符串在/
之后的最后一个匹配项。
我根据Wiktor Stribiżew的代码更改了正则表达式规则。
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"