我有一个文本文件:
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
显然我不想要任何事情;。
有任何帮助吗?
答案 0 :(得分:3)
您当前的正则表达式贪婪(.*
),因此它尽可能匹配(gene=
之后的所有内容以及 last之后的所有内容发生 ;
)。您可以通过添加惰性量词.*
来使?
懒惰:.*?
。然而,由于懒惰量词的回溯,存在更好的选择(减少发现匹配之前的步数)。
选项1
(?<=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'