2012-03-20 71 views
3

POSIX表达式让我头疼。从字符串中提取数字和名称[r]

假设我们有一个字符串:

a = "[question(37), question_pipe(\"Person10\")]" 

最终我想能够有:

b = c("37", "Person10") 

我有一个看看stringr包,但无法弄清楚如何使用正则表达式提取信息,并使用str_split

任何帮助将不胜感激。

卡梅伦

+2

是否所有行都有这种格式? – 2012-03-21 00:19:58

+0

是的,但内容可能不同,即''[question(37),question_pipe(\'Cam B \')]'' 它是从surveygizmo响应数据的JSON数据中提取的 – 2012-03-21 00:49:16

回答

3

所以,如果我理解正确的要提取的括号内的元素。

你可以先提取那些元素,包括括号,使用str_extract_all

b1 <- str_extract_all(string = a, pattern = "\\(.*?\\)") 
b1 
# [[1]] 
# [1] "(37)"   "(\"Person10\")" 

由于str_extract_all返回一个列表,让我们把它变成一个载体:

b2 <- unlist(b1) 
b2 
# [1] "(37)"   "(\"Person10\")" 

最后,你可以删除圆括号(每个字符串的第一个和最后一个字符)使用str_sub

b3 <- str_sub(string = b2, start = 2L, end = -2L) 
b3 
# [1] "37"   "\"Person10\"" 

编辑:关于正则表达式模式的几点意见:\\(\\)是您的开始和结束括号。 .*?表示任何字符串,但不会贪婪,否则您会从第一个(到最后一个)获得一个长匹配。

+0

这对我来说很有用,谢谢。但是,你如何删除“\”以及额外的“从人10的末尾? – 2012-03-21 00:56:33

+0

啊,它得到了'gsub(”\“”,“,b3)'谢谢你的帮助flodel :) – 2012-03-21 01:04:04

+0

这是更多简洁:b1 < - unlist(str_extract_all(string = a,pattern =“\\(。*?\\)”)); b < - gsub(“[[:punct:]]”,“”,b1) – Kay 2012-03-21 15:41:20

3

这应该在你工作的具体情况:

a <- "[question(37), question_pipe(\"Person10\")]" 

# First split into two parts 
b <- strsplit(a, ",")[[1]] 

# Extract the number (skip as.integer if you want it as character) 
x <- as.integer(gsub("[^0-9]","", b[[1]])) # 37 

# Extract the stuff in quotes 
y <- gsub(".*\"(.*)\".*", "\\1", b[[2]]) # "Person10" 

从第一部分在括号中提取所有的替代:

x <- gsub(".*\\((.*)\\).*", "\\1", b[[1]]) # "37" 
0

我会做这种方式:

a <- "[question(37), question_pipe(\"Person10\")]" 
b <- unlist(strsplit(gsub("\"","",gsub(".*question\\((.*)\\).*question_pipe\\((.*)\\).*","\\1,\\2",a)),",")) 
print(b) 
[1] "37"  "Person10" 
0

扩展flodel的答案 - 这将是最简洁的解决方案,我认为:

a <- "[question(37), question_pipe(\"Person10\")]"  
b1 <- unlist(str_extract_all(string = a, pattern = "\(.*?\)")) 
b <- gsub("[[:punct:]]", "", b1)