POSIX Expression令我头疼。
让我们说我们有一个字符串:
a = "[question(37), question_pipe(\"Person10\")]"
最终我希望能够:
b = c("37", "Person10")
我查看了stringr
包,但无法弄清楚如何使用正则表达式和str_split
提取信息。
非常感谢任何帮助。
卡梅伦
答案 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)