【问题标题】:how to replace multiple consecutive repeating characters into 1 character in python?如何在python中将多个连续重复字符替换为1个字符?
【发布时间】:2017-10-12 04:07:45
【问题描述】:

我在 python 中有一个字符串,我想将多个连续的重复字符替换为 1。 例如:

st = "UUUURRGGGEENNTTT"
print(st.replace(r'(\w){2,}',r'\1'))

但是这个命令似乎不起作用,请任何人帮忙找出这个命令有什么问题?

还有另一种方法可以解决这个问题,但想了解上述命令失败的原因以及有什么方法可以纠正它:

print(re.sub(r"([a-z])\1+",r"\1",st)) -- print URGENT

【问题讨论】:

    标签: python string


    【解决方案1】:

    您需要使用正则表达式。 所以你可以这样做:

    import re
    
    re.sub(r'[^\w\s]|(.)(?=\1)', '', 'UUURRRUU')
    

    结果是 UR。

    这是我所得到的快照:

    对于这个正则表达式:(.)(?=.*\1)

    (.) means: match any char except new lines (line breaks)
    ?=. means: lookahead every char except new line (.) 
    * means: match a preceding token
    \1 means: to mach the result of captured group, which is the U or R ...
    

    然后用''替换所有匹配项

    你也可以检查这个: lookahead

    还检查这个工具我用它解决了我的正则表达式, 它描述了一切,你可以从中学到很多东西: regexer

    【讨论】:

    • 抱歉错过了:D
    • 正则表达式对学习很有用,谢谢!
    【解决方案2】:

    你的代码不起作用的原因是因为str.replace不支持正则表达式,你只能用另一个字符串替换一个子字符串。如果要通过匹配正则表达式模式进行替换,则需要使用 re 模块。

    其次,您的正则表达式模式也不正确,(\w){2,} 将匹配出现 2 次或更多次的任何字符(但不必是同一个字符),因此它不起作用。您将需要执行以下操作:

    import re
    st = "UUUURRGGGEENNTTT"
    print(re.sub(r'(\w)\1+',r'\1', st)))
    # URGENT
    

    现在这只会匹配同一个字符 2 次或更多次。

    对此的另一种“独特”解决方案是您可以使用itertools 提供的unique_justseen 配方:

    from itertools import groupby
    from operator import itemgetter
    
    st = "UUUURRGGGEENNTTT"
    new ="".join(map(next, map(itemgetter(1), groupby(st))))
    
    print(new)
    # URGENT
    

    【讨论】:

      【解决方案3】:

      string.replace(s, old, new[, maxreplace]) 只做子串替换:

      >>> '(\w){2,}'.replace(r'(\w){2,}',r'\1') 
      '\\1'
      

      这就是它失败的原因,它不能与正则表达式一起使用,因此无法更正第一个命令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 2021-12-24
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-17
        相关资源
        最近更新 更多