我有一个数据集,我需要在其中获取两个管道分隔符之间的文本。文本的长度是可变的,所以我不能使用长度来获取它。这是一个字符串:
ENST00000000233.10|ENSG00000004059.11|OTTHUMG000
我想得到第一个和第二个管道之间的文本,即ENSG00000004059.11。我尝试了几个不同的正则表达式,但我不能真正弄清楚正确的语法。正确的正则表达式应该是什么?
ENSG00000004059.11
piztneat1#
这是一个正则表达式。
x <- "ENST00000000233.10|ENSG00000004059.11|OTTHUMG000" sub("^[^\\|]*\\|([^\\|]+)\\|.*$", "\\1", x) #> [1] "ENSG00000004059.11"
由reprex package(v2.0.1)于2022年5月3日创建说明:
^
[^\\|]*
\\|
^[^\\|]*\\|
([^\\|]+)
\\|.*$
然后将第1个(也是唯一的)组替换为它自己"\\1",从而删除其他所有内容。
"\\1"
rbl8hiat2#
另一种选择是在|上拆分字符串后获取第二个项。
|
x <- "ENST00000000233.10|ENSG00000004059.11|OTTHUMG000" strsplit(x, "\\|")[[1]][[2]] # strsplit(x, "[|]")[[1]][[2]] # [1] "ENSG00000004059.11"
或者使用tidyverse:
tidyverse
library(tidyverse) str_split(x, "\\|") %>% map_chr(`[`, 2) # [1] "ENSG00000004059.11"
olhwl3o23#
也许可以使用look ahead和look hind的正则表达式来提取被两个"|".正则表达式的字面意思是-在后面查找一个或多个字符(.+?)"|"((?<=\\|)),直到"|"((?=\\|))。
.+?
(?<=\\|)
(?=\\|)
library(stringr) x <- "ENST00000000233.10|ENSG00000004059.11|OTTHUMG000" str_extract(x, "(?<=\\|).+?(?=\\|)") [1] "ENSG00000004059.11"
nfs0ujit4#
尝试这个:\|.*\|或在R \\|.*\\|中,因为你需要转义字符。(它只是转义第一个管道,后面跟着任何字符(.)重复任何次数(*),然后再跟着另一个转义管道)。然后用str_sub(MyString, 2, -2)包起来,如果你不想要的话,就把管道去掉。
\|.*\|
\\|.*\\|
str_sub(MyString, 2, -2)
4条答案
按热度按时间piztneat1#
这是一个正则表达式。
由reprex package(v2.0.1)于2022年5月3日创建
说明:
^
字符串开头;[^\\|]*
不是管道字符零次或多次;\\|
管道字符需要转义,因为它是元字符;^[^\\|]*\\|
上述3个组合意味着匹配除了字符串开始处的管道字符之外的任何字符零次或多次,直到找到管道字符;([^\\|]+)
组至少匹配管道字符以外的任何字符一次;\\|.*$
第二根管道加上直到管柱末端的任何值。然后将第1个(也是唯一的)组替换为它自己
"\\1"
,从而删除其他所有内容。rbl8hiat2#
另一种选择是在
|
上拆分字符串后获取第二个项。或者使用
tidyverse
:olhwl3o23#
也许可以使用look ahead和look hind的正则表达式来提取被两个"|".
正则表达式的字面意思是-在后面查找一个或多个字符(
.+?
)"|"((?<=\\|)
),直到"|"((?=\\|)
)。nfs0ujit4#
尝试这个:
\|.*\|
或在R\\|.*\\|
中,因为你需要转义字符。(它只是转义第一个管道,后面跟着任何字符(.)重复任何次数(*),然后再跟着另一个转义管道)。然后用
str_sub(MyString, 2, -2)
包起来,如果你不想要的话,就把管道去掉。