R语言 如何创建正则表达式以获取两个管道之间的子字符串

lztngnrs  于 2023-02-14  发布在  其他
关注(0)|答案(4)|浏览(107)

我有一个数据集,我需要在其中获取两个管道分隔符之间的文本。文本的长度是可变的,所以我不能使用长度来获取它。这是一个字符串:

ENST00000000233.10|ENSG00000004059.11|OTTHUMG000

我想得到第一个和第二个管道之间的文本,即ENSG00000004059.11。我尝试了几个不同的正则表达式,但我不能真正弄清楚正确的语法。正确的正则表达式应该是什么?

piztneat

piztneat1#

这是一个正则表达式。

x <- "ENST00000000233.10|ENSG00000004059.11|OTTHUMG000"
sub("^[^\\|]*\\|([^\\|]+)\\|.*$", "\\1", x)
#> [1] "ENSG00000004059.11"

reprex package(v2.0.1)于2022年5月3日创建
说明:

  • ^字符串开头;
  • [^\\|]*不是管道字符零次或多次;
  • \\|管道字符需要转义,因为它是元字符;
  • ^[^\\|]*\\|上述3个组合意味着匹配除了字符串开始处的管道字符之外的任何字符零次或多次,直到找到管道字符;
  • ([^\\|]+)组至少匹配管道字符以外的任何字符一次;
  • \\|.*$第二根管道加上直到管柱末端的任何值。

然后将第1个(也是唯一的)组替换为它自己"\\1",从而删除其他所有内容。

rbl8hiat

rbl8hiat2#

另一种选择是在|上拆分字符串后获取第二个项。

x <- "ENST00000000233.10|ENSG00000004059.11|OTTHUMG000"

strsplit(x, "\\|")[[1]][[2]]
# strsplit(x, "[|]")[[1]][[2]]

# [1] "ENSG00000004059.11"

或者使用tidyverse

library(tidyverse)

str_split(x, "\\|") %>% map_chr(`[`, 2)

# [1] "ENSG00000004059.11"
olhwl3o2

olhwl3o23#

也许可以使用look ahead和look hind的正则表达式来提取被两个"|".
正则表达式的字面意思是-在后面查找一个或多个字符(.+?)"|"((?<=\\|)),直到"|"((?=\\|))。

library(stringr)

x <- "ENST00000000233.10|ENSG00000004059.11|OTTHUMG000"
str_extract(x, "(?<=\\|).+?(?=\\|)")

[1] "ENSG00000004059.11"
nfs0ujit

nfs0ujit4#

尝试这个:\|.*\|或在R \\|.*\\|中,因为你需要转义字符。(它只是转义第一个管道,后面跟着任何字符(.)重复任何次数(*),然后再跟着另一个转义管道)。
然后用str_sub(MyString, 2, -2)包起来,如果你不想要的话,就把管道去掉。

相关问题