首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何返回在R中的“向前看”正则表达式中捕获的值

如何返回在R中的“向前看”正则表达式中捕获的值
EN

Stack Overflow用户
提问于 2017-03-05 14:32:21
回答 2查看 103关注 0票数 1

我试图使用这个正则表达式来捕获字符串中的数字。

代码语言:javascript
复制
gsub("\\d+(?= win)", "\\1", "1 win & 1 nomination", perl = TRUE)

我想捕获值1(1 win),但是\\1返回字符串win & 1 nomination,如何使它返回数字1?

编辑:我还需要捕获的胜利字符串,如:提名2金球奖。另有21人胜出,72人获得提名。

示例字符串和结果:

  • String:获得2项金球奖提名。另有21人胜出,72人获得提名。结果:21
  • String:3胜2提名。结果:3
  • String:赢得2项奥斯卡奖。另有72人获胜,57人获得提名。结果:72
EN

回答 2

Stack Overflow用户

发布于 2017-03-05 14:40:28

试试这个:

代码语言:javascript
复制
gsub("^(\\d+).*", "\\1", "1 win & 1 nomination")
[1] "1"
票数 1
EN

Stack Overflow用户

发布于 2017-03-05 14:58:21

您的解决方案-- gsub("\\d+(?= win)", "\\1", "1 win & 1 nomination", perl = TRUE) --无法工作,因为您的模式中没有捕获组,而且\1是空的。因此,您可以有效地删除1+数字,这些数字位于space+win之前。

如果您需要将空格之前的数字和winwins作为整体单词,请使用以下regmatches解决方案:

代码语言:javascript
复制
> x <- c("Nominated for 2 Golden Globes. Another 21 wins & 72 nominations.", "3 wins & 2 nominations.", "Won 2 Oscars. Another 72 wins & 57 nominations.")
> regmatches(x, regexpr("\\d+(?=\\s*wins?\\b)", x, perl=TRUE))
[1] "21" "3"  "72"

详细信息

  • \\d+ -1或更多位数
  • (?=\\s*wins?\\b) -只有在跟随的情况下
    • \\s* -0或更多的空白空间
    • wins?\\b --还有整个单词winwins

使用regex的另一个变体(不匹配subwinwins作为整体词)使用TRE regex (默认风格)的解决方案:

代码语言:javascript
复制
> sub(".*?(\\d+)\\s*win.*", "\\1", x)
[1] "21" "3"  "72"

详细信息

  • .*? -匹配任何0+字符,尽可能少,直到第一个.
  • (\\d+) -(第1组后来用\\1表示)-1或更多位数
  • \\s* - 0+白空间
  • win -一个win字符序列
  • .* -到字符串末尾的任何0+字符。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42609611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档