以下是我的数据中的一些示例:
a <-c("sp|Q9Y6W5|","sp|Q9HB90|,sp|Q9NQL2|","orf|NCBIAAYI_c_1_1023|",
"orf|NCBIACEN_c_10_906|,orf|NCBIACEO_c_5_1142|",
"orf|NCBIAAYI_c_258|,orf|aot172_c_6_302|,orf|aot180_c_2_405|")
对于a:单个字符串可以包含更多的&#34; sp |&#34;和&#34; orf&#34;
结果必须如下:
[1] "sp|Q9Y6W5" "sp|Q9HB90,sp|Q9NQL2" "orf|NCBIAAYI_c_1_1023"
"orf|NCBIACEN_c_10_906,orf|NCBIACEO_c_5_1142"
"orf|NCBIAAYI_c_258,orf|aot172_c_6_302,orf|aot180_c_2_405"
所以目的是删除最后一个&#34; |&#34;对于每个&#34; sp |&#34;和&#34; orf |&#34;条目。似乎&#34; |&#34;是一个特殊的挑战,因为它是正则表达式中的元字符。此外,&#34; orf |&#34;的长度和组成。条目变化很大。他们唯一的共同点是&#34; orf |&#34;或&#34; sp |&#34;在开头那个&#34; |&#34;是在最后一个位置。我尝试使用gsub()以及stringr包或regexpr()或[:punct:]尝试不同的东西,但没有真正起作用。也许这只是错误的组合。
答案 0 :(得分:1)
我们可以使用gsub
来匹配后跟|
的{{1}}或匹配字符串的末尾(,
)并替换为空白({1}} {1}})
$
或者我们""
gsub("[|](?=(,|$))", "", a, perl = TRUE)
#[1] "sp|Q9Y6W5"
#[2] "sp|Q9HB90,sp|Q9NQL2"
#[3] "orf|NCBIAAYI_c_1_1023"
#[4] "orf|NCBIACEN_c_10_906,orf|NCBIACEO_c_5_1142"
#[5] "orf|NCBIAAYI_c_258,orf|aot172_c_6_302,orf|aot180_c_2_405"
将split
个,', remove the last character with
列表'元素粘贴在一起
, and
答案 1 :(得分:0)
可能有效的替代方案。你需要逃避&#34; |
&#34;使用&#34; \\|
&#34;。
# Input
a <-c("sp|Q9Y6W5|","sp|Q9HB90|,sp|Q9NQL2|","orf|NCBIAAYI_c_1_1023|",
"orf|NCBIACEN_c_10_906|,orf|NCBIACEO_c_5_1142|",
"orf|NCBIAAYI_c_258|,orf|aot172_c_6_302|,orf|aot180_c_2_405|")
# Expected output
b <- c("sp|Q9Y6W5", "sp|Q9HB90,sp|Q9NQL2", "orf|NCBIAAYI_c_1_1023" ,
"orf|NCBIACEN_c_10_906,orf|NCBIACEO_c_5_1142" ,
"orf|NCBIAAYI_c_258,orf|aot172_c_6_302,orf|aot180_c_2_405")
res <- gsub("\\|,", ",", gsub("\\|$", "", a))
all(res == b)
#[1] TRUE
您可以构建对gsub
的单个正则表达式调用,但这很简单易懂。内部gsub
查找|
和字符串的结尾并将其删除。外gsub
查找,|
并替换为,
。
答案 2 :(得分:0)
您不必在此处使用PCRE正则表达式,因为您可以使用默认的TRE正则表达式完成所有操作(如果指定perl=TRUE
,则使用PCRE正则表达式引擎编译模式,有时比TRE慢默认的正则表达式引擎)。
这是一个简单的gsub
调用:
gsub("\\|(,|$)", "\\1", a)
请参阅online R demo。正如你所看到的,没有任何外观是必要的。
模式详情
\\|
- 文字|
符号(因为如果你没有将其转义或放入括号表达式,它将表示一个交替运算符,请参阅下面的一行)(,|$)
- 一个捕获组(从替换模式引用\1
)匹配两个备选方案中的任何一个:
,
- 逗号|
- 或(交替运营商)$
- 字符串锚定结束。替换字符串中的\1
告诉正则表达式引擎将存储在捕获组#1中的内容插回到结果字符串中(因此,逗号将在必要时以这种方式恢复)。