我有很多这样的字符串:
2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0
我想提取位于最后一个"/"
之后并以"_"
结尾的子字符串:
556662
我发现了如何提取:/01/01/07/556662
通过使用以下正则表达式:(\/)(.*?)(?=\_)
请告知如何捕获正确的组。
答案 0 :(得分:3)
您可以使用
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个或更多字符。< / p>
或
stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"
这将提取一个字符串的最后一个匹配项,该字符串由_
之后的/
和/
以外的1个或多个字符组成。
答案 1 :(得分:1)
您可以使用捕获组:
/([^_/]+)_[^/\s]*
说明
/
字面上匹配([^_/]+)
捕获不匹配下划线或正斜杠的组_[^/\s]*
匹配_
,然后匹配0+次不是正斜杠或空格字符获取捕获组的一个方法可能是使用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”