用于基因名称提取的Python正则表达式

时间:2018-02-21 20:25:29

标签: python regex

我有一个文本文件:

Chr1 0  100 gene49 Gnomon gene  ID=gene49;Name=LOC101947233;Dbxref=GeneID:101947233;gbkey=Gene;gene=LOC444342;part=1%2F1

我试图从每一行中仅提取基因名称(所以我想提取基因= LOC444342,就是这样。)

我一直在使用以下正则表达式:

 gene=.*;

但是,它不断提取以下内容:

gene=LOC444342;part=1%2F1

显然我不想要任何事情;。

有任何帮助吗?

2 个答案:

答案 0 :(得分:3)

您当前的正则表达式贪婪.*),因此它尽可能匹配(gene=之后的所有内容以及 last之后的所有内容发生 ;)。您可以通过添加惰性量词.*来使?懒惰:.*?。然而,由于懒惰量词的回溯,存在更好的选择(减少发现匹配之前的步数)。

选项1

See regex in use here

(?<=gene=)[^;]+
  • (?<=gene=)肯定的背后隐藏确保匹配gene=字面上的内容
  • [^;]+匹配;除{/ 1}}之外的任何字符

结果:LOC444342

选项2

在匹配中加入gene=;,您可以将以下内容用作seen in use here

gene=[^;]*;

结果:gene=LOC444342;

答案 1 :(得分:2)

使用零宽度外观:

(?<=;)gene=[^;]+(?=;)
  • 正面观察(?<=;);

    之前的gene=...相匹配
  • gene=[^;]+匹配从gene=到下一个;

  • 的所需部分
  • 零宽度正向前瞻(?=;),确保匹配后跟;

没有外观,有捕获的分组:

;(gene=[^;]+);

现在,您需要获取第一个(仅)捕获的组。

示例:

In [4]: str_ = r'Chr1 0  100 gene49 Gnomon gene  ID=gene49;Name=LOC101947233;Dbxref=GeneID:101947233;gbkey=Gene;gene=LOC444342;part=1%2F1'

In [5]: re.search(r'(?<=;)gene=[^;]+(?=;)', str_).group()
Out[5]: 'gene=LOC444342'

In [6]: re.search(r';(gene=[^;]+);', str_).group(1)
Out[6]: 'gene=LOC444342'