如何使用gsub编辑多个模式

时间:2019-06-28 13:13:58

标签: r regex gsub

我想在数据列中的特定字符串之间添加一个-

此列包含以下字符串:

mmu-let-7a3
mmu-miR-19b1
mmu-miR-548d2
mmu-miR-450a1

-必须位于最后一个字母字符之间,但仅当最后一个字母字符特别是a,b,c或d与最后一个数字字符之间时,但也必须位于最后一个数字字符之间1、2或3。

输出应如下所示

mmu-let-7a-3
mmu-miR-19b-1
mmu-miR-548d-2
mmu-miR-450a-1

是否存在可以使用gsub完成此操作的正则表达式代码?还是其他功能?

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

有多种方法可以实现此目的,但是由于您提到了// I want to concatenate this with some other strings let s = String::from("Amelia"); // The following won't compile: you can't make an array of &str and String assert_eq!(["Hello", ", ", s].concat(), "Hello, Amelia"); // WRONG // However, &*s takes a reference to the str pointed to by s. assert_eq!(["Hello", ", ", &*s].concat(), "Hello, Amelia"); // OK ,因此这里有一个使用正向后视的选项

(g)sub

或使用两个捕获组

sub("(?<=[a-d])([1-3])$", "-\\1", x, perl = T)
#[1] "mmu-let-7a-3"   "mmu-miR-19b-1"  "mmu-miR-548d-2" "mmu-miR-450a-1"

说明:

  • sub("([a-d])([1-3])$", "\\1-\\2", x) 匹配字母[a-d]"a""b""c"
  • "d"在字符串末尾匹配[1-3]$"1""2"(由于"3"字符串末尾锚定)

样本数据

$

答案 1 :(得分:2)

# let
x <- c("mmu-let-7a3", "mmu-miR-19b1", "mmu-miR-548d2", "mmu-miR-450a1", "mmu-miR-450g4")

sub("([a-d])([1-3])$", "\\1-\\2", x)
[1] "mmu-let-7a-3"   "mmu-miR-19b-1"  "mmu-miR-548d-2" "mmu-miR-450a-1" "mmu-miR-450g4" 

答案 2 :(得分:2)

我们可以做到:

test <- "mmu-miR-450a1"
gsub("([a-d])([1-3])$","\\1-\\2",test)
[1] "mmu-miR-450a-1"

或使用stringr

stringr::str_replace_all(x,
   "([a-d])([1-3])$","\\1-\\2")
[1] "mmu-let-7a-3"   "mmu-miR-19b-1"  "mmu-miR-548d-2"
[4] "mmu-miR-450a-1"