【问题标题】:Find Regex for deleting duplicates查找用于删除重复项的正则表达式
【发布时间】:2017-01-10 15:24:39
【问题描述】:

我想找到正则表达式,它使以下匹配(注意有一个换行符!)

输入字符串:

"a0Ew0"
"a0Ew0"
"a0Ew0s"
"a0Ew0s"

输出:

"a0Ew0"
"a0Ew0s"

【问题讨论】:

  • 您想要一个正则表达式有什么特别的原因吗?另外,重复项总是直接紧接,还是可以穿插?
  • 我看不出正则表达式应该在这里做什么,我能想到的唯一你想做的就是实现一个唯一性过滤器
  • @Willem Van Onsem 没错
  • 没有。您为这项工作使用了错误的工具。退后一步,重新思考你在做什么以及为什么。
  • 订单需要保留吗?

标签: python regex


【解决方案1】:

您可以将列表转换为一组以消除重复项

请参阅以下内容:https://repl.it/FFOJ/0

l = set(["a0Ew000001UD2t8EAD", "a0Ew000001UD2t8EAD", "a0Ew000001UD4AFEA1", "a0Ew000001UD4AFEA1"])
print(l)

【讨论】:

    【解决方案2】:

    在这种情况下,正则表达式不是正确的工具。

    如果重复元素是连续的,您可以使用简单的列表推导来实现:

    lines=""""a0Ew000001UD2t8EAD"
    "a0Ew000001UD2t8EAD"
    "a0Ew000001UD4AFEA1"
    "a0Ew000001UD4AFEA1"
    """.splitlines()
    
    filtered = [l for i,l in enumerate(lines) if i==0 or lines[i-1]!=l ]
    

    仅当它是第一个元素时才创建元素(因此 index == 0 测试或前一个元素与当前元素不同)。

    结果:

    ['"a0Ew000001UD2t8EAD"', '"a0Ew000001UD4AFEA1"']
    

    【讨论】:

      【解决方案3】:

      当你可以做到这一点时,你不需要正则表达式来做到这一点:

      from collections import OrderedDict
      
      inputString = """"a0Ew0"
      "a0Ew0"
      "a0Ew0s"
      "a0Ew0s"
      """
      
      ls = inputString.split("\n") #splits the string to a list
      print(*(list(OrderedDict.fromkeys(ls)))) 
      

      输出:

      "a0Ew0" "a0Ew0s" 
      

      【讨论】:

        【解决方案4】:

        如果你真的,真的想使用正则表达式,你可以使用negative lookahead (?!...) 来检查当前组(".+") 后面是否没有换行符\n 和它本身再次\1

        >>> inpt = """"a0Ew000001UD2t8EAD"
        "a0Ew000001UD2t8EAD"
        "a0Ew000001UD2t8EAD"
        "a0Ew000001UD4AFEA1"
        "a0Ew000001UD4AFEA1"
        "a0Ew000001UD2t8EAD"
        """
        >>> re.findall(r'(".+")(?!\n\1)', inpt)
        ['"a0Ew000001UD2t8EAD"', '"a0Ew000001UD4AFEA1"', '"a0Ew000001UD2t8EAD"']
        

        但是,我宁愿建议使用例如itertools.groupby:

        >>> [key for key, group in itertools.groupby(inpt.splitlines())]
        ['"a0Ew000001UD2t8EAD"', '"a0Ew000001UD4AFEA1"', '"a0Ew000001UD2t8EAD"']
        

        (请注意我如何将第一行的另一个副本添加到数据集的末尾,以表明这两种解决方案都只认为行是重复的,因为它们彼此紧挨着出现,中间没有任何内容。如果你也想要删除中间有不同行的重复项,我怀疑是否会有使用正则表达式的解决方案。)

        【讨论】:

          【解决方案5】:

          正则表达式:Python

          (\w+)
          

          如果连续,你可以删除偶数或奇数元素。
          均匀

          [0]"a0Ew0ssss" <-- Deleted
          [1]"a0Ew0ssss"
          [2]"a0Ew0" <-- Deleted
          [3]"a0Ew0"
          [4]"a0Ew0s" <-- Deleted
          [5]"a0Ew0s"
          

          结果:

          [0]"a0Ew0ssss"
          [1]"a0Ew0"
          [2]"a0Ew0s"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-23
            • 2013-01-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多