POSIX表达式让我头疼。从字符串中提取数字和名称[r]
假设我们有一个字符串:
a = "[question(37), question_pipe(\"Person10\")]"
最终我想能够有:
b = c("37", "Person10")
我有一个看看stringr
包,但无法弄清楚如何使用正则表达式提取信息,并使用str_split
。
任何帮助将不胜感激。
卡梅伦
POSIX表达式让我头疼。从字符串中提取数字和名称[r]
假设我们有一个字符串:
a = "[question(37), question_pipe(\"Person10\")]"
最终我想能够有:
b = c("37", "Person10")
我有一个看看stringr
包,但无法弄清楚如何使用正则表达式提取信息,并使用str_split
。
任何帮助将不胜感激。
卡梅伦
所以,如果我理解正确的要提取的括号内的元素。
你可以先提取那些元素,包括括号,使用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\""
编辑:关于正则表达式模式的几点意见:\\(
和\\)
是您的开始和结束括号。 .*?
表示任何字符串,但不会贪婪,否则您会从第一个(
到最后一个)
获得一个长匹配。
这对我来说很有用,谢谢。但是,你如何删除“\”以及额外的“从人10的末尾? – 2012-03-21 00:56:33
啊,它得到了'gsub(”\“”,“,b3)'谢谢你的帮助flodel :) – 2012-03-21 01:04:04
这是更多简洁:b1 < - unlist(str_extract_all(string = a,pattern =“\\(。*?\\)”)); b < - gsub(“[[:punct:]]”,“”,b1) – Kay 2012-03-21 15:41:20
这应该在你工作的具体情况:
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"
我会做这种方式:
a <- "[question(37), question_pipe(\"Person10\")]"
b <- unlist(strsplit(gsub("\"","",gsub(".*question\\((.*)\\).*question_pipe\\((.*)\\).*","\\1,\\2",a)),","))
print(b)
[1] "37" "Person10"
扩展flodel的答案 - 这将是最简洁的解决方案,我认为:
a <- "[question(37), question_pipe(\"Person10\")]"
b1 <- unlist(str_extract_all(string = a, pattern = "\(.*?\)"))
b <- gsub("[[:punct:]]", "", b1)
是否所有行都有这种格式? – 2012-03-21 00:19:58
是的,但内容可能不同,即''[question(37),question_pipe(\'Cam B \')]'' 它是从surveygizmo响应数据的JSON数据中提取的 – 2012-03-21 00:49:16