在 R 中拆分逗号和分号分隔的字符串

问题描述 投票:0回答:2

我正在尝试拆分包含两个条目的字符串,每个条目都有特定的格式:

  • 类别(例如
    active site
    /
    region
    ),后跟
    :
  • 术语(例如
    His, Glu
    /
    nucleotide-binding motif A
    ),后跟
    ,

这是我要拆分的字符串:

string <- "active site: His, Glu,region: nucleotide-binding motif A,"

这是我迄今为止所尝试过的。除了两个空子字符串之外,它会产生所需的输出。

unlist(str_extract_all(string, ".*?(?=,(?:\\w+|$))"))

[1] "active site: His, Glu"              ""                                   "region: nucleotide-binding motif A"
[4] "" 

如何去掉空子字符串?

r regex string string-matching
2个回答
3
投票

您会得到空字符串,因为

.*?
也可以匹配此断言
(?=,(?:\\w+|$))
为 true 的空字符串

您可以在匹配之前使用否定字符类来排除匹配冒号或逗号

:

[^:,\n]+:.*?(?=,(?:\w|$))

解释

  • [^:,\n]+
    匹配 1 个以上字符,除了
    :
    ,
    或换行符
  • :
    匹配冒号
  • .*?
    尽可能匹配任意字符
  • (?=
    正向前瞻,断言当前位置直接右侧的内容:
    • ,
      按字面意思匹配
    • (?:\w|$)
      匹配单个单词字符,或断言字符串结尾
  • )
    关闭前瞻

正则表达式演示 | R 演示

string <- "active site: His, Glu,region: nucleotide-binding motif A,"
unlist(str_extract_all(string, "[^:,\\n]+:.*?(?=,(?:\\w|$))"))

输出

[1] "active site: His, Glu"              "region: nucleotide-binding motif A"

2
投票

比@第四只鸟+1长得多而且不那么优雅, 但它有效:

library(stringr)

string2 <- strsplit(string, "([^,]+,[^,]+),", perl = TRUE)[[1]][2]
string1 <- str_replace(string, string2, "")
string <- str_replace_all(c(string1, string2), '\\,$', '')
> string
[1] "active site: His, Glu"             
[2] "region: nucleotide-binding motif A"
© www.soinside.com 2019 - 2024. All rights reserved.