2016-04-04 40 views
0

你好我是python的新手,我希望你能帮助我。我有一个文本文件(称为data.txt)与基因编号和相应的rs号和一些距离测量数据。数据看起来像这样:从python中的文本文件中提取一个字符串2.7.5

rs1982171  55349  40802 

    rs6088650  55902  38550 

    rs1655902  3105  12220 

    rs1013677  55902  0 

其中第一列是RS号,第二列是基因数,第三列是一些距离度量。数据要大得多,但希望上面的内容能让您了解数据集。我想要做的是找到与某个基因相对应的所有rs数字。例如,对于上面的数据集,基因55902 = {rs6088650,rs1013677}。理想情况下,我想让我的代码找到与给定基因相对应的所有rs数字。因为我不能现在做,我不是写了一个短代码,让包含在data.txt文件字符串“55902”的台词:

import re 
    data=open("data.txt","r") 
    for line in data: 
     line=line.rstrip() 
     if re.search("55902",line): 
     print line 

这段代码的问题是,输出这样的事情:

rs6088650 55902  38550 

    rs1655902 3105  12220 

    rs1013677 55902  0 

我想我的代码忽略rs号中的字符串“55902”。换句话说,我不知道我的代码输出在上面的输出的第二行,因为基因数目不55902.我想我的输出是:

 rs6088650  55902 38550 

     rs1013677  55902 0 

如何修改上面的代码达到我想要的。任何帮助,将不胜感激。提前致谢。

+0

根据你想要多少个不同的基因,以收集RS号码,你'将所有数据放入['pandas'](http://pandas.org)'DataFrame'并在那里分析它可能会好得多。 – MattDMo

+0

感谢您的建议! –

回答

0

这里没有必要使用正则表达式,因为您要查找的只是一个简单的静态序列。这条线:

if re.search("55902",line): 

可以表示为:

if "55902" in line: 

如果你只想检查第二列,分割行头:

if '55902' in line.split()[1]: 

既然你现在已经检查了正确的列,请检查平等而不是成员资格:

if line.split()[1] == '55902': 
0

您可以使用word boundary (\b),以全字匹配搜索:

>>> import re 
>>> re.search(r"\b55902\b", "rs1655902  3105  12220") 
>>> re.search(r"\b55902\b", "rs6088650  55902  38550") 
<_sre.SRE_Match object at 0x7f82594566b0> 

if re.search(r"\b55902\b", line): 
    .... 
0

您可以用更强大的正则表达式很容易做到这一点。一个可能的快速解决方案是使用以下形式的正则表达式:

r'\b55902\b' 

\b字界限。

0

如果你想使用regex,那么你可以使用Word边界\b沿着matchsearch作为

x = " rs1982171  55349  40802".strip() 

if (re.match(r"\b55349\b", x.split()[1])): 
    print x 

IDEONE DEMO