提取字符串中括号之间的数字

时间:2012-10-04 20:21:08

标签: regex r

  

可能重复:
  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

非常感谢任何提示和帮助。

2 个答案:

答案 0 :(得分:10)

有许多可能的正则表达式来执行此操作。这是一个:

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

  • ?$最后一篇文章确保我抓住了最后一组数字,如评论中所述。

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

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

清楚如泥!享受您的数据项目!

答案 1 :(得分:3)

这是一个gsubfn解决方案:

library(gsubfn)

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

[(]匹配一个开放的paren,(\\d+)匹配一串数字,因为它周围的parens创建了一个后引用,最后[)]匹配一个紧密的paren。返回后引用。