R 正则表达式捕获组?

标签 r regex string

我有很多这样的字符串:

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"

参见 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 个或多个字符除了_

或者

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/

相关文章:

r - 基于 R 中 beta分散() 多元分散体标记 PCoA 的质心

r - 获取列表中等于特定条件的值

python - 如何使用单个 re.sub 删除数字之间的多个空格

java - 替换字符串中的模式匹配

java - 根据条件结束正则表达式

R - 在应用函数中使用 "next"语句

r - 使用 SparkR 查找生成主键的变量

regex - 匹配除指定字符串之外的所有内容

ios - JSQMessagesViewController 自定义链接

c# - 在上标中添加字符串 3