Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7。如果在2行或更多行中找到字符串,则只保留第一行_Python_Regex_Duplicates - Fatal编程技术网

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
    在其中出现

  • 最后用第一个捕获的组(即您的第一个模式)替换整个比赛

  • Python代码(在Python 3.5.2中测试)


    正如其他用户所指出的,正则表达式并不是解决这个问题的最佳技术。您可以使用字典,然后删除重复项:

    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'