【问题标题】:Remove duplicate chars using regex?使用正则表达式删除重复字符?
【发布时间】:2011-06-02 06:00:04
【问题描述】:

假设我想使用正则表达式删除字符串中的所有重复字符(特定字符的)。这很简单 -

import re
re.sub("a*", "a", "aaaa") # gives 'a'

如果我想用相应的字符替换所有重复的字符(即 a、z)怎么办?我该怎么做?

import re
re.sub('[a-z]*', <what_to_put_here>, 'aabb') # should give 'ab'
re.sub('[a-z]*', <what_to_put_here>, 'abbccddeeffgg') # should give 'abcdefg'

注意:我知道这种删除重复的方法可以通过哈希表或一些 O(n^2) 算法更好地解决,但我想使用正则表达式来探索这一点

【问题讨论】:

    标签: python regex string


    【解决方案1】:
    >>> import re
    >>> re.sub(r'([a-z])\1+', r'\1', 'ffffffbbbbbbbqqq')
    'fbq'
    

    [a-z] 周围的() 指定一个捕获组,然后模式和替换中的\1(一个反向引用)指的是第一个捕获组的内容。

    因此,正则表达式读取“找到一个字母,然后是一个或多个相同字母的出现”,然后整个找到的部分被替换为找到的字母的单个出现。

    旁注...

    您的 a 示例代码实际上是错误的:

    >>> re.sub('a*', 'a', 'aaabbbccc')
    'abababacacaca'
    

    您真的希望在您的正则表达式中使用'a+' 而不是'a*',因为* 运算符匹配“0 次或更多”次,因此将匹配两个非a 字符之间的空字符串,而+ 运算符匹配“1 个或多个”。

    【讨论】:

      【解决方案2】:

      如果您也有兴趣删除 non-contiguous 重复项,则必须将内容包装在一个循环中,例如像这样

       s="ababacbdefefbcdefde"
      
       while re.search(r'([a-z])(.*)\1', s):
           s= re.sub(r'([a-z])(.*)\1', r'\1\2', s)
      
       print s  # prints 'abcdef'
      

      【讨论】:

      • 或者:s = ''.join(set(s)) ;)(好吧,不是正则表达式)
      • 这行得通吗?一个例子:s = 'good people understand'; while re.search(r'([a-z])(.*)\1', s): s = re.sub(r'([a-z])(.*)\1', r'\1\2', s); print(s) # prints "god pel unrsta"
      • @OlegMelnikov 所以,它确实将每个字符减少到一次出现,所以这对我来说看起来不错。它不会减少两个空格,因此您仍然会在输出字符串中得到两个空格。但是正则表达式中不包含空格,所以我认为这也可以。如果这让您感到不安,您必须调整正则表达式中的字符类。
      • 嗨,托马斯。你是对的。我的错。事实上,我看到你用粗体表示“不连续”:) 感谢您的澄清。我将把我的例子留给其他人澄清。
      【解决方案3】:

      一个包含所有类别的解决方案:

      re.sub(r'(.)\1+', r'\1', 'aaaaabbbbbb[[[[[')
      

      给予:

      'ab['
      

      【讨论】:

      • 它有效,有趣。但是具有双字符的正确短语呢,例如:告诉、气味、居住、商场。
      • 您添加过滤器?不要指望正则表达式懂英语
      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多