【问题标题】:extract substring in R在R中提取子字符串
【发布时间】:2019-11-14 10:10:12
【问题描述】:

假设我有字符串"S[+229]EC[+57]VDSTDNSSK[+229]PSSEPTSHVAR" 的列表,并且需要获取一个字符串向量,该向量仅包含带括号的数字,例如。 [+229][+57].

R 中有没有方便的方法来做到这一点?

【问题讨论】:

  • @Ronak Shah 我认为您的编辑将_ 引入了字符串。 @Gattu 你想要在列出[+229][+57] 或者更确切地说是所有括号内的数字[+229][+57][+229] 时输出?
  • @MartinMorgan 是的,抱歉已修复。下划线是原始帖子中的斜体。我以为它是字符串的一部分。

标签: r regex substring


【解决方案1】:

使用base R,然后尝试使用

> unlist(regmatches(s,gregexpr("\\[\\+\\d+\\]",s)))
[1] "[+229]" "[+57]"  "[+229]"

或者你可以使用

> gsub(".*?(\\[.*\\]).*","\\1",gsub("\\].*?\\[","] | [",s))
[1] "[+229] | [+57] | [+229]"

【讨论】:

  • 嗨,Thomas 我用过 > gsub("[^\[\]+0-9]+","",s,perl = T) [1] "[+229][+57 ][+229]" 但是如何用 | 分隔每个括号例如。 [+229] | [+57] | [+229]?
  • @Gattu 你的意思是像"[+229] | [+57] | [+229]" 这样的输出吗?那你可以试试gsub(".*?(\\[.*\\]).*","\\1",gsub("\\].*?\\[","] | [",s))
  • 谢谢托马斯,是的,这正是我正在寻找的
  • @Gattu 太棒了!然后我会将它添加到我的解决方案中。如果你愿意,你可以接受我的回答,然后关闭问题。谢谢!
【解决方案2】:

我们可以从stringr使用str_extract_all

stringr::str_extract_all(x, "\\[\\+\\d+\\]")[[1]]
#[1] "[+229]" "[+57]"  "[+229]"

如果您只需要唯一值,请将其包装在 unique 中。


同样,在基础 R 中使用 regmatchesgregexpr

regmatches(x, gregexpr("\\[\\+\\d+\\]", x))[[1]]

数据

x <- "S[+229]EC[+57]VDSTDNSSK[+229]PSSEPTSHVAR"

【讨论】:

  • 非常感谢您的帮助。我怎样才能插入 |例如。 [+229]|[+57]|[+229]
  • @Gattu 你可以做paste0(regmatches(x, gregexpr("\\[\\+\\d+\\]", x))[[1]], collapse = "|")
【解决方案3】:

好像你想删除字母字符,所以

gsub("[[:alpha:]]", "", x)

其中[:alpha:] 是字母(小写和大写)字符的类别,[[:alpha:]] 表示“匹配任何单个字母字符”,gsub() 表示全局替换任何带有空的字母字符字符串""。这似乎比尝试匹配括号内的数字要好,后者需要弄清楚哪些字符需要用(双精度!)\\ 进行转义。

如果打算返回唯一括号内的数字,那么方法是提取匹配项(而不是删除不需要的字符)。我不会使用gsub() 将匹配项替换为具有另一个值的正则表达式,而是使用gregexpr() 来识别匹配项,并使用regmatches() 来提取匹配项。由于数字总是出现在[] 中,我将简化正则表达式以匹配集合+[:digit:] 中的一个或多个(+)字符。

> xx <- regmatches(x, gregexpr("[+[:digit:]]+", x))
> xx
[[1]]
[1] "+229" "+57"  "+229"

xx 是一个长度等于x 长度的列表。我将编写一个函数,对于此列表的任何元素,使值唯一,用[] 包围这些值,并将它们连接起来

fun <- function(x)
    paste0("[", unique(x), "]", collapse = "")

这需要应用到列表的每个元素上,并简化为一个向量,任务为sapply()

> sapply(xx, fun)
[1] "[+229][+57]"

一个小的改进是使用vapply(),这样结果对于零长度输入是稳健的(总是返回长度等于x的字符向量)

> x = character()
> xx <- regmatches(x, gregexpr("[+[:digit:]]+", x))
> sapply(xx, fun)               # Hey, this returns a list :(
list()
> vapply(xx, fun, "character")  # vapply() deals with 0-length inputs
character(0)

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 2019-02-03
    • 1970-01-01
    • 2022-07-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多