代码之家  ›  专栏  ›  技术社区  ›  Luis Ramon Ramirez Rodriguez

删除字符串中重复的双关语

  •  0
  • Luis Ramon Ramirez Rodriguez  · 技术社区  · 4 年前

    我正在清理以下文本:

    Great talking with you. ? See you, the other guys and Mr. Jack Daniels next  week, I hope-- ? Bobette ? ? Bobette  Riner???????????????????????????????   Senior Power Markets Analyst??????   TradersNews Energy 713/647-8690 FAX: 713/647-7552 cell:  832/428-7008 bobette.riner@ipgdirect.com http://www.tradersnewspower.com ? ?  - cinhrly020101.doc
    

    它有多个空格和问号,为了清理它,我使用了正则表达式:

    def remove_duplicate_characters(text):     
        text = re.sub("\s+"," ",text) 
        text = re.sub("\s*\?+","?",text)
        text = re.sub("\s*\?+","?",text)
        return text
    
    
    remove_duplicate_characters(msg)
    
    
    
    remove_duplicate_characters(msg)
    

    这给了我以下结果:

    'Great talking with you.? See you, the other guys and Mr. Jack Daniels next week, I hope--? Bobette? Bobette Riner? Senior Power Markets Analyst? TradersNews Energy 713/647-8690 FAX: 713/647-7552 cell: 832/428-7008 bobette.riner@ipgdirect.com http://www.tradersnewspower.com? - cinhrly020101.doc'
    

    对于这个特殊情况,它确实有效,但如果我想添加更多字符来删除,它看起来不是最好的方法。是否有最佳方法来解决这个问题?

    1 回复  |  直到 4 年前
        1
  •  3
  •   Wiktor Stribiżew    4 年前

    要将所有连续的标点符号替换为它们的单个出现,您可以使用

    re.sub(r"([^\w\s]|_)\1+", r"\1", text)
    

    如果必须删除前导空格,请使用 r"\s*([^\w\s]|_)\1+" 正则表达式。

    请参阅 regex demo online .

    如果你想对此通用正则表达式引入例外,你可以在左侧添加一个替代项,在那里你可以捕获所有需要保留连续标点符号的上下文:

    re.sub(r'((?<!\.)\.{3}(?!\.)|://)|([^\w\s]|_)\2+', r'\1\2', text)
    

    请参阅 this regex demo .

    这个 ((?<!\.)\.{3}(?!\.)|://)|([^\w\s]|_)\2+ 正则表达式匹配并捕获 ... (两端没有其他点)和a :// string(常见于URL中),其余的是具有调整后的反向引用的原始正则表达式(从现在开始,有两个捕获组)。

    这个 \1\2 在替换模式中,将捕获的vaues放回生成的字符串中。