【问题标题】:how do you extract values between two characters in R?你如何提取R中两个字符之间的值?
【发布时间】:2016-12-16 19:58:44
【问题描述】:

我正在尝试使用正则表达式从 R 中的此字符串中提取服务器名称 (server101):

@ 和后面的第一个 句号 (.)

之间的值
t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com")

我试过这个:

gsub('.*\\@(\\d+),(\\d+).*', '\\1', t)

这似乎不起作用,有什么想法吗?

【问题讨论】:

  • gsub('@([^.]+)|.', '\\1', t)

标签: r regex


【解决方案1】:

由于您只期望一个匹配项,因此您可以在此处使用简单的sub

t <- "Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com"
sub(".*@([^.]+)\\..*", "\\1", t)
##  => [1] "server101"

请参阅R demo online

详情

  • .* - 任何 0+ 个字符,尽可能多
  • @ - 一个 @ 字符
  • ([^.]+) - 第 1 组 ("\\1"):
  • \\. - 一个点(您需要转义的其他字符是$^*()+[?、@98765)
  • .* - 任何 0+ 个字符,尽可能多

这里有一些替代品。

您可以使用以下基本 R 代码在第一个 @ 之后提取除 . ([^.]+) 之外的 1+ 个字符:

> t <- "Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com"
> pattern="@([^.]+)"
> m <- regmatches(t,regexec(pattern,t))
> result = unlist(m)[2]
> result
[1] "server101"

使用regexec,您可以访问子匹配(捕获组内容)。

online R demo

另一种方法是将regmatches/regexpr 与带有(?&lt;=@) 后视的PCRE 正则表达式一起使用,仅检查字符是否存在,但不将字符放入匹配中:

> result2 <- regmatches(t, regexpr("(?<=@)[^.]+", t, perl=TRUE))
> result2
[1] "server101"

一个干净的 stringr 方法是使用与str_extract 相同的 PCRE 正则表达式(使用类似的(因为它也支持环视)、ICU、正则表达式风格):

> library(stringr)
> t<-c("Current CPU load - jvm machine[example network-app_svc_group_mem4]@server101.example.com")
> str_extract(t, "(?<=@)[^.]+")
[1] "server101"

【讨论】:

    【解决方案2】:

    带串:

    library(stringr)
    str_match(t, ".*@([^\\.]*)\\..*")[2]
    #[1] "server101"
    

    【讨论】:

    • 仅供参考:str_match 不需要完整的字符串匹配。此外,字符类中的点被视为文字点,不需要转义。由于在@ 之后有一些预期值,我认为+(1 次或多次出现)比*(0 次或多次出现)更合乎逻辑。因此,我将在str_match 中使用以下模式:"@([^.]+)"
    • 感谢@WiktorStribiżew 提供的信息,非常感谢。
    猜你喜欢
    • 2023-04-08
    • 2020-01-29
    • 1970-01-01
    • 2019-10-26
    • 2021-01-17
    • 2019-10-25
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多