5

可能重复:
在 R 中的所有括号内提取信息(正则表达式)

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

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

"East Kootenay C (5901035) RDA 01011"

或像这样:

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

我想要的只是59010355933039

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

4

2 回答 2

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。.

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

一定要清如泥!享受您的数据处理项目!

于 2012-10-04T20:42:40.170 回答
3

这是一个 gsubfn 解决方案:

library(gsubfn)

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

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

于 2012-10-04T23:00:41.027 回答