我正在尝试拆分包含两个条目的字符串,每个条目都有特定的格式:
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] ""
如何去掉空子字符串?
您会得到空字符串,因为
.*?
也可以匹配此断言 (?=,(?:\\w+|$))
为 true 的空字符串
您可以在匹配之前使用否定字符类来排除匹配冒号或逗号
:
[^:,\n]+:.*?(?=,(?:\w|$))
解释
[^:,\n]+
匹配 1 个以上字符,除了 :
,
或换行符:
匹配冒号.*?
尽可能匹配任意字符(?=
正向前瞻,断言当前位置直接右侧的内容:
,
按字面意思匹配(?:\w|$)
匹配单个单词字符,或断言字符串结尾)
关闭前瞻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"
比@第四只鸟+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"