我从excel中输入数据,一个单元格包含这些包含数字和字母的长字符串,有没有办法从该字符串中提取数字并将其存储在新变量中?不幸的是,有些条目有两组括号,我只想要第二组?我可以用grep吗?
字符串看起来或多或少是这样的,字符串的长度会有所不同:
"East Kootenay C (5901035) RDA 01011"
或者像这样:
"Thompson-Nicola J (Copper Desert Country) (5933039) RDA 02020"
我想要的只是5901035
和5933039
非常感谢任何提示和帮助。
答案 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。返回后引用。