在R中提取括号内的信息
Extract info inside parenthesis in R
我有一些行,一些有括号,一些没有。喜欢 ABC(DEF)
和 ABC
。我想从括号中提取信息:
- ABC(DEF) -> DEF
- ABC -> NA
我写了
gsub(".*\((.*)\).*", "\1",X).
它对 ABC(DEF) 有效,但是当没有括号时输出 "ABC"。
如果您在正则表达式中使用 sub
时不想得到 ABC
,则需要添加一个匹配所有非空字符串的替代项并将其删除。
X <- c("ABC(DEF)", "ABC")
sub(".*(?:\((.*)\)).*|.*", "\1",X)
^^^
参见IDEONE demo。
请注意,您不必使用 gsub
,只需执行一次替换,因此 sub
即可。
此外,stringr str_match
也可以方便地完成此任务:
str_match(X, "\((.*)\)")
或
str_match(X, "\(([^()]*)\)")
使用 string_extract() 即可。
library(stringr)
df$`new column` <- str_extract(df$`existing column`, "(?<=\().+?(?=\))")
这会在现有列的括号内创建一个包含任何文本的新列。如果列中没有括号,则填NA。
我的回答灵感来自this answer on the original question about this topic
我有一些行,一些有括号,一些没有。喜欢 ABC(DEF)
和 ABC
。我想从括号中提取信息:
- ABC(DEF) -> DEF
- ABC -> NA
我写了
gsub(".*\((.*)\).*", "\1",X).
它对 ABC(DEF) 有效,但是当没有括号时输出 "ABC"。
如果您在正则表达式中使用 sub
时不想得到 ABC
,则需要添加一个匹配所有非空字符串的替代项并将其删除。
X <- c("ABC(DEF)", "ABC")
sub(".*(?:\((.*)\)).*|.*", "\1",X)
^^^
参见IDEONE demo。
请注意,您不必使用 gsub
,只需执行一次替换,因此 sub
即可。
此外,stringr str_match
也可以方便地完成此任务:
str_match(X, "\((.*)\)")
或
str_match(X, "\(([^()]*)\)")
使用 string_extract() 即可。
library(stringr)
df$`new column` <- str_extract(df$`existing column`, "(?<=\().+?(?=\))")
这会在现有列的括号内创建一个包含任何文本的新列。如果列中没有括号,则填NA。
我的回答灵感来自this answer on the original question about this topic