【问题标题】:Remove multiple occurrence in a row from a certain character in a string从字符串中的某个字符中删除一行中的多次出现
【发布时间】:2021-04-21 11:32:18
【问题描述】:

我想在 Python 中将多个 '.' 连续删除为单个 '.'

这是我的代码,我想出的:

# remove multiple occurrences of '.'
string = "FOO...BAR......FOO..BAR.FOO"
last_char = None
new_string = ""
for char in string:
    if not (last_char == '.' and char == '.'):
        new_string += char
    last_char = char
string = new_string
print(string)

它确实在做我想做的事,但我认为必须有一种更优雅的方式来做到这一点。

>>> FOO.BAR.FOO.BAR.FOO

【问题讨论】:

    标签: python python-3.x string replace


    【解决方案1】:

    使用带有模式"\.+" 的正则表达式(re 模块)更容易,这意味着

    • 一个点\.
    • 重复 1 到无限次 +
    import re
    
    string = "FOO...BAR......FOO..BAR.FOO"
    string = re.sub(r"\.+", '.', string)
    print(string)  # FOO.BAR.FOO.BAR.FOO
    

    或者只是将所有 2 个点替换为一个,直到不再有 2 个点为止

    string = "FOO...BAR......FOO..BAR.FOO"
    while string.find('..') >= 0:
        string = string.replace("..", ".")
    print(string)  # FOO.BAR.FOO.BAR.FOO
    

    【讨论】:

    • 谢谢!我现在正在研究正则表达式。但是为什么需要'\'呢?没有会发生什么?
    • @manman 在正则表达式中,点的意思是“任何字符”,所以你需要用``转义它以获得真正的点
    【解决方案2】:
    string = "FOO...BAR......FOO..BAR.FOO"
    
    print (".".join([x for x in string.split(".") if x]))
    

    输出:

    FOO.BAR.FOO.BAR.FOO
    

    您在任何给定字符处拆分,如果列表元素不为空且具有与定界符相同的给定字符,则连接回字符串。因此,您将所有多次出现的给定字符替换为单个字符。

    一步一步:

    string = "FOO...BAR......FOO..BAR.FOO"
    
    print ([x for x in string.split(".")])
    
    print ([x for x in string.split(".") if x])
    
    print (".".join([x for x in string.split(".") if x]))
    

    输出:

    ['FOO', '', '', 'BAR', '', '', '', '', '', 'FOO', '', 'BAR', 'FOO']
    ['FOO', 'BAR', 'FOO', 'BAR', 'FOO']
    FOO.BAR.FOO.BAR.FOO
    

    【讨论】:

    • 这是一个很酷的解决方案,感谢您的意见。但这超出了我的想象。我知道您将字符串拆分为“。”并在没有'.'的情况下遍历该列表但周围的一切我都不明白。
    • 谢谢。现在我完全明白了! :-)
    猜你喜欢
    • 2020-06-16
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2011-12-19
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多