R:使用POSIX正则表达式从字符串中提取数据

时间:2011-04-16 10:11:08

标签: regex r string

如何使用POSIX样式的正则表达式从此字符串中仅提取DATABASE_NAME?

st <- "MICROSOFT_SQL_SERVER.DATABASE\INSTANCE.DATABASE_NAME."

首先,这会产生错误

Error: '\I' is an unrecognized escape in character string starting "MICROSOFT_SQL_SERVER.DATABASE\I"

我在想像

这样的东西
sub(".*\\.", st, "")

3 个答案:

答案 0 :(得分:3)

第一个问题是您需要转义字符串中的\

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."

至于主要问题,这将从您给出的字符串中返回您想要的位:

> sub("\\.$", "", sub("[A-Za-z0-9\\._]*\\\\[A-Za-z]*\\.", "", st))
[1] "DATABASE_NAME"

但更简单的解决方案是拆分\\.并选择最后一个块:

> strsplit(st, "\\.")[[1]][3]
[1] "DATABASE_NAME"

或稍微更自动化

> sst <- strsplit(st, "\\.")[[1]]
> tail(sst, 1)
[1] "DATABASE_NAME"

答案 1 :(得分:2)

其他答案提供了使用strsplitstr_split解决问题的一些非常好的替代方法。

但是,如果确实想要使用正则表达式和gsub,则此解决方案会将前两个匹配项(字符串后跟句点)替换为空字符串。

注意使用?修饰符告诉正则表达式不要贪婪,以及{2}修饰符告诉它在括号中重复两次表达式。

gsub("\\.", "", gsub("(.+?\\.){2}", "", st)) 
[1] "DATABASE_NAME"

答案 2 :(得分:1)

另一种方法是在str_split包中使用stringr。我们的想法是在每个时期将st分成字符串,然后隔离第三个字符串:

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."

library(stringr)

str_split(st, "\\.")[[1]][3]

[1] "DATABASE_NAME"