Python 2.7。如果在2行或更多行中找到字符串,则只保留第一行
我有一个巨大的文件,看起来像这样:Python 2.7。如果在2行或更多行中找到字符串,则只保留第一行,python,regex,duplicates,Python,Regex,Duplicates,我有一个巨大的文件,看起来像这样: CAV-1 ATCTACTTCTATCG CAV-2 GCGCGTAGCTAGCT CAV-2 AAGCGCTCGTAAAA CAV-3 AAATATATATATCC 使用Python,我想删除具有重复字符串的行,在本例中为“CAV-2”。包含字符串的第一行将保留。我会得到这个: CAV-1 ATCTACTTCTATCG CAV-2 GCGCGTAGCTAGCT CAV-3 AAATATATATATCC 我知道如何使用正则表达式并通过行进行解析,但我无法完
CAV-1 ATCTACTTCTATCG
CAV-2 GCGCGTAGCTAGCT
CAV-2 AAGCGCTCGTAAAA
CAV-3 AAATATATATATCC
使用Python,我想删除具有重复字符串的行,在本例中为“CAV-2”。包含字符串的第一行将保留。我会得到这个:
CAV-1 ATCTACTTCTATCG
CAV-2 GCGCGTAGCTAGCT
CAV-3 AAATATATATATCC
我知道如何使用正则表达式并通过行进行解析,但我无法完成这项特定任务
我知道如何使用您必须使用这样的捕获组 正则表达式:
((CAV-\d\s)[AGCT]+)(?:\n\2[AGCT]+)*
说明:
((CAV-\d\s)[AGCT]+)
检查您的模式并捕获整个匹配。子匹配CAV-\d\s
在第二个捕获组中捕获(?:\n\2[AGCT]+)*
检查是否有多个子模式CAV-\d\s
在其中出现正如其他用户所指出的,正则表达式并不是解决这个问题的最佳技术。您可以使用字典,然后删除重复项:
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']
用字典就行了
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'
如果要保留第一行,可以使用列表字典,然后输出最后一个元素文件是否始终排序?拆分行,将第一部分作为dict中的键,并检查每一行是否第一部分已经在dict键中。您好@Psidom,我不想删除重复的行,我想删除包含重复正则表达式的行。这是我熟悉的函数,但也欢迎使用其他替代方法。如果列表可以无序排列,或者以后可以排序,您可以使用一个集合,查看它是否在字符串中的列表中排序,可以找到一个解决方案
(?m)^((\S+)(=\S)。*\r?\n)\S*^\2(?=\S)。*(?:\r?\n)?
替换$1
谢谢@Rahul。你能解释一下,在我的问题中,你将如何合并这个正则表达式吗?。非常感谢
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'