gpt4 book ai didi

r - 优化 R 中的正则表达式以进行子字符串提取

转载 作者:行者123 更新时间:2023-12-02 18:26:50 25 4
gpt4 key购买 nike

我对之前的答案有一个后续问题,可以在这里找到:Split uneven string in R - variable substring and delimiters

总之,我想提取遵循以下模式的字符串中的粗体文本:

sp|Q2UVX4|CO3_BOVIN **Complement C3** OS=Bos taurus OX=9913 GN=**C3** PE=1 SV=2

以下是 Martin Gal 提供的部分答案:

protein_name = ifelse(str_detect(string, ".*_BOVIN\\s(.*?)\\sOS=.*"), 
str_replace(string, ".*_BOVIN\\s(.*?)\\sOS=.*", "\\1"),
NA_character_),

他的回答非常好,但有时我有多种物种(例如:牛和人类),所以我想让代码更灵活一点。我尝试仅使用空格 (\\s) 和带有空格 ([A-Z]\\s) 的大写字母,但第一个失败,第二个对于某些字符串不准确。然后,我将 Martin 的方法与以大写字母结尾的字符串混合在一起,旨在选择整个第一个 block 作为分隔符(例如:sp|Q2UVX4|CO3_BOVIN)。

对此:

protein_name = ifelse(str_detect(string, "[a-z]{2}\\|(.*?)[A-Z]\\s(.*?)\\sOS=.*"), 
str_replace(string, "[a-z]{2}\\|(.*?)[A-Z]\\s(.*?)\\sOS=.*", "\\2")
  • 在这种情况下,选择两种模式之间的所有内容的最佳方法是什么?这两种模式是“sp”和大写字母后跟一个空格。
  • 我使用了(.*?),这是最好的方法吗?

最佳答案

可以通过以下方式解决:

str_extract_all(string, "(?<=(?:BOVIN|HUMAN) )(.*?)(?= OS).*?GN=(\\w+)") %>%
map_df(~read.table(text=str_replace(.,"OS.*GN", ""), sep="=",
col.names = c('protein_name', 'gene')), .id='grp')
grp protein_name gene
1 1 Complement C3 C3
2 1 C3-beta-c C3
3 1 C3-beta-c C3
4 2 Haptoglobin HP
5 2 Haptoglobin HP
6 2 Haptoglobin HP
7 3 Anion exchange protein SLC4A7
8 4 Isoform V3 of Versican core protein VCAN
9 4 Isoform V2 of Versican core protein VCAN
10 4 Versican core protein VCAN
11 5 Keratin 10 (Epidermolytic hyperkeratosis; keratosis palmaris et plantaris) KRT10
12 5 Keratin, type I cytoskeletal 10 KRT10

您还可以使用以下内容。请注意,as_tibble 不是必需的。用它来获得漂亮的结果

unlist(strsplit(string, "\\w{2}=\\w+\\K;", perl = TRUE))%>%
sub(".*?(?:BOVIN|HUMAN) (.*?)(?= OS).*?GN=(\\w+).*|.*", "\\1:\\2", ., perl = TRUE) %>%
read.table(text=., sep=":") %>%
as_tibble()

A tibble: 14 x 2
V1 V2
<chr> <chr>
1 "Complement C3" "C3"
2 "C3-beta-c" "C3"
3 "C3-beta-c" "C3"
4 "" ""
5 "Haptoglobin" "HP"
6 "Haptoglobin" "HP"
7 "Haptoglobin" "HP"
8 "" ""
9 "Anion exchange protein" "SLC4A7"
10 "Isoform V3 of Versican core protein" "VCAN"
11 "Isoform V2 of Versican core protein" "VCAN"
12 "Versican core protein" "VCAN"
13 "Keratin 10 (Epidermolytic hyperkeratosis; keratosis palmaris et plantaris)" "KRT10"
14 "Keratin, type I cytoskeletal 10" "KRT10"

关于r - 优化 R 中的正则表达式以进行子字符串提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70008287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com