在R中的某些字符之间提取文本

时间:2016-12-22 16:12:34

标签: r regex

我需要从以下字符串中捕获TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer],基本上从-@符号。

i<-c("Current CPU load - TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]@example1.com")

我试过这个:

str_match(i, ".*-([^\\.]*)\\@.*")[,2]

我得到NA,有什么想法吗?

3 个答案:

答案 0 :(得分:4)

1)gsub 将所有内容替换为-,包括.* -,以及@之后的所有内容,即@.*,长度为零的字符串。不需要包裹:

gsub(".* - |@.*", "", i)
## "TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]"

2)sub 这也行。它将所有内容与空间,减号,空格(即.* -)匹配,然后捕获所有内容,直到@(即(.*)@)后跟剩下的任何内容(.*)并替换为与捕获组,即parens中的部分。它也不使用包。

sub(".*- (.*)@.*", "\\1", i)
## [1] "TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]"

注意:我们将其用作输入i

i <- "Current CPU load - TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]@example1.com"

答案 1 :(得分:2)

您可以使用

-\s*([^@]+)

请参阅regex demo

<强>详情:

  • - - 连字符
  • \s* - 零个或多个空格
  • ([^@]+) - 第1组捕获除@以外的1个或多个字符。

R demo:

> library(stringr)
> i<-c("Current CPU load - TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]@example1.com")
> str_match(i, "-\\s*([^@]+)")[,2]
[1] "TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]"

相同的模式可以与基础R regmatches / regexec

一起使用
> regmatches(i, regexec("-\\s*([^@]+)", i))[[1]][2]
[1] "TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]"

如果您更喜欢替换方法,可以使用sub

> sub(".*?-\\s*([^@]+).*", "\\1", i)
[1] "TEST_WF1_CORP[-application-com.ibm.ws.runtime.WsServer]"

此处.*?匹配任何0+字符,尽可能少,直到第一个-,然后-,0 +空格(\\s*),然后除@以外的1个字符被捕获到组1中(请参阅([^@]+)),然后.*匹配字符串的其余部分。替换模式中的\1将组1的内容放回替换结果中。

答案 2 :(得分:2)

以下内容应该有效:

lrwxrwxrwx 1 root root     12 Mar  9  2016 e113c810.0 -> Certigna.pem
lrwxrwxrwx 1 root root     25 Mar  9  2016 e18bfb83.0 -> QuoVadis_Root_CA_3_G3.pem
lrwxrwxrwx 1 root root     36 Mar  9  2016 e268a4c5.0 -> AddTrust_Low-Value_Services_Root.pem
lrwxrwxrwx 1 root root     49 Mar  9  2016 e2799e36.0 -> GeoTrust_Primary_Certification_Authority_-_G3.pem
lrwxrwxrwx 1 root root     25 Mar  9  2016 e36a6752.0 -> Atos_TrustedRoot_2011.pem
lrwxrwxrwx 1 root root     25 Mar  9  2016 e442e424.0 -> QuoVadis_Root_CA_3_G3.pem