2017-09-26 13 views
-1

我有一个巨大的文件,看起来像这样:Python 2.7。如果在2行以上发现的字符串,只保留第一行

CAV-1 ATCTACTTCTATCG 
CAV-2 GCGCGTAGCTAGCT 
CAV-2 AAGCGCTCGTAAAA 
CAV-3 AAATATATATATCC 

使用Python,我想删除其重复串线,在这种情况下, “CAV-2”。具有该字符串的第一行将保留。我会得到这样的:

CAV-1 ATCTACTTCTATCG 
CAV-2 GCGCGTAGCTAGCT 
CAV-3 AAATATATATATCC 

我知道如何使用正则表达式,并通过线来分析,但我不能够做到这一点的具体任务。

我知道如何使用

+0

是您的文件总是排序? – RomanPerekhrest

+0

分割线,把第一部分作为关键字,并检查每一行,如果第一部分已经是一个字典键。 –

+0

嗨@Psidom,我不想删除重复行,我想删除包含重复正则表达式的行。这是我熟悉的功能,但欢迎其他选择。 – Lucas

回答

1

正如其他用户所指出的那样,正则表达式是不是这个问题的最佳方法。您可以使用字典,然后删除重复:

from collections import defaultdict 
d = defaultdict(list) 
s = ["CAV-1 ATCTACTTCTATCG", "CAV-2 GCGCGTAGCTAGCT", "CAV-2 AAGCGCTCGTAAAA", "CAV-3 AAATATATATATCC"] 
for name, sequence in [i.split() for i in s]: 
    d[name].append(sequence) 
final_output = [' '.join([a, b[0]]) for a, b in d.items()] 

输出:

['CAV-1 ATCTACTTCTATCG', 'CAV-2 GCGCGTAGCTAGCT', 'CAV-3 AAATATATATATCC'] 
1

你将不得不使用这样的捕获组。

正则表达式:((CAV-\d\s)[AGCT]+)(?:\n\2[AGCT]+)*

说明:

  1. ((CAV-\d\s)[AGCT]+)检查你的模式和捕捉整场比赛。在第二捕获组中捕获子匹配CAV-\d\s

  2. (?:\n\2[AGCT]+)*检查子版本CAV-\d\s在其中的多个事件。

  3. 最后用第一个捕获组取代整个比赛,即第一个模式。

Regex101 Demo

Python代码(在Python 3.5.2测试)

import re 

# Open file having genetic code. Use your file path. 
new1 = 'C:\\Users\\acer\\Desktop\\new1.txt' 

# Create a new file for replaced data. Use your file path. 
new2 = 'C:\\Users\\acer\\Desktop\\new2.txt' 

fp1 = open(new1, 'r') # Opening original file in read mode 
fp2 = open(new2, 'w') # Opening replaced data in write mode. 

lines = fp1.readlines() # Reading data from original file. 
lines = ''.join(lines) # Joined all lines as one line. 

# Regex substitution on joined lines. Will repalce the duplicate data. 
lines = re.sub(r'((CAV-\d+\s)[AGCT]+)(?:\n\2[AGCT]+)*', r'\1', lines) 

#Writing replaced data to new file. 

fp2.write(lines) 

# Closing files. 

fp1.close() 
fp2.close() 
+0

谢谢@Rahul。你能否解释一下你将如何将这个正则表达式融合到我的问题中?非常感谢 – Lucas

+0

@Lucas:检查更新。 – Rahul

3

只需使用一本字典

In [1]: lines = '''CAV-1 ATCTACTTCTATCG 
    ...: CAV-2 GCGCGTAGCTAGCT 
    ...: CAV-2 AAGCGCTCGTAAAA 
    ...: CAV-3 AAATATATATATCC''' 

In [2]: lines 
Out[2]: 'CAV-1 ATCTACTTCTATCG\nCAV-2 GCGCGTAGCTAGCT\nCAV-2 AAGCGCTCGTAAAA\nCAV-3 AAATATATATATCC' 

In [3]: res = {} 

In [4]: for line in lines.split("\n"): 
    ...:   res[line.split(" ")[0]] = line.split(" ")[1] 
    ...: 

In [5]: res 
Out[5]: 
{'CAV-1': 'ATCTACTTCTATCG', 
'CAV-2': 'AAGCGCTCGTAAAA', 
'CAV-3': 'AAATATATATATCC'} 

In [6]: '\n'.join(['%s %s' % (key, value) for (key, value) in res.items()]) 
Out[6]: 'CAV-1 ATCTACTTCTATCG\nCAV-2 AAGCGCTCGTAAAA\nCAV-3 AAATATATATATCC' 

如果您想保留第一行,你可以使用字典然后输出最后一个元素

相关问题