【问题标题】:Extract numbers between brackets within a string [duplicate]提取字符串中括号之间的数字[重复]
【发布时间】:2012-10-04 20:21:07
【问题描述】:

可能重复:
Extract info inside all parenthesis in R (regex)

我从 excel 导入数据,一个单元格由这些包含数字和字母的长字符串组成,有没有办法只从该字符串中提取数字并将其存储在一个新变量中?不幸的是,有些条目有两组括号,我只想要第二组?我可以使用 grep 吗?

字符串看起来或多或少是这样的,但是字符串的长度会有所不同:

"East Kootenay C (5901035) RDA 01011"

或者像这样:

"Thompson-Nicola J (Copper Desert Country) (5933039) RDA 02020"

我想要的只是59010355933039

任何提示和帮助将不胜感激。

【问题讨论】:

  • 同一行中是否可以有两个括号中的数字实例?例如,"East Kootenay C (5901035) (5933039) RDA 01011"

标签: regex r


【解决方案1】:

有许多可能的正则表达式可以做到这一点。这是一个:

x=c("East Kootenay C (5901035) RDA 01011","Thompson-Nicola J (Copper Desert Country) (5933039) RDA 02020")

> gsub('.+\\(([0-9]+)\\).+?$', '\\1', x)
[1] "5901035" "5933039"

让我们分解第一个表达式'.+\\(([0-9]+)\\).+'的语法

  • .+ 任何一项或多项
  • \\( 括号是正则表达式中的特殊字符,所以如果我想表示实际的东西(,我需要用\ 对其进行转义。我必须再次为 R 转义它(因此有两个 \s)。

  • ([0-9]+)我提到了特殊字符,这里我用了两个。第一个是括号,表示我要保留的组。第二个[] 围绕着事物组。请参阅?regex 了解更多信息。

  • ?$ 最后一部分确保我抓住了 cmets 中指出的括号中的最后一组数字。

我也可以使用* 代替.,这意味着0 或多个而不是一个或多个i,以防你的paren 字符串出现在字符串的开头或结尾。

gsub 的第二部分是我替换第一部分的部分。我用过:\\1。这表示使用组 1(上面的 ( ) 内的东西。我需要再次转义它两次,一次用于正则表达式,一次用于 R。

一定要一清二楚!享受您的数据处理项目!

【讨论】:

  • 正则解释做得很好!
  • 我会在你的正则表达式中添加两个字符,以确保 OP 抓取最后一个括号内的数字:gsub('.+\\(([0-9]+)\\).+?$', '\\1', x)。也许根据需要换掉+并放入*
  • @BlueMagister 好电话。相应地编辑
【解决方案2】:

这是一个 gsubfn 解决方案:

library(gsubfn)

strapplyc(x, "[(](\\d+)[)]", simplify = TRUE)

[(] 匹配一个左括号,(\\d+) 匹配一串数字,由于它周围的括号创建一个反向引用,最后[)] 匹配一个闭括号。返回反向引用。

【讨论】: