从字符串中提取数字和名称[r]

时间:2012-03-20 23:53:33

标签: regex r string text-extraction

POSIX Expression令我头疼。

让我们说我们有一个字符串:

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

最终我希望能够:

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

我查看了stringr包,但无法弄清楚如何使用正则表达式和str_split提取信息。

非常感谢任何帮助。

卡梅伦

4 个答案:

答案 0 :(得分: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\""

编辑:关于正则表达式模式的一些注释:\\(\\)是您的左右括号。 .*?表示任何字符串但不贪婪,否则您将从第一个(到最后一个)获得一个长匹配。

答案 1 :(得分: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"

答案 2 :(得分:0)

我这样做:

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

答案 3 :(得分:0)

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

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