【问题标题】:Replacing multiple similar strings替换多个相似的字符串
【发布时间】:2016-03-30 14:26:55
【问题描述】:

我有以下表达:

a = 'x11 + x111 + x1111 + x1'

我想替换以下内容:

from_ = ['1', '11', '111', '1111']
to = ['2', '22', '333', '3333']

因此得到以下结果:

anew = 'x22 + x333 + x3333 + x2'

如何使用 Python 做到这一点?

这是一个类似的问题:Python replace multiple strings。但是,在我的情况下,如果我在问题中使用建议的答案,则替换的值会被自己覆盖。因此,在提到的链接中,结果是'x22 + x222 + x2222 + x2'

【问题讨论】:

    标签: python string replace


    【解决方案1】:

    re 库 (regex) 中的re.sub 可以在您需要进行多值替换时使用。

    re.sub 接受函数的附加参数,在该函数中您可以进行必要的更改。来自文档

    re.sub(pattern, repl, string, count=0, flags=0)
    

    如果repl 是一个函数,它会为每个不重叠的函数调用 模式的发生。该函数采用单个匹配对象 参数,并返回 替换字符串.

    (强调我的)

    这里的正则表达式很简单,即\d+,这意味着您正在匹配所有数字组。

    你可以使用下面的代码 sn-p 得到你想要的输出

    import re
    
    a = 'x11 + x111 + x1111 + x1'
    
    def substitute(matched_obj):
        from_ = ['1', '11', '111', '1111']
        to = ['2', '22', '333', '3333']
        part = matched_obj.group(0)
        if part in from_:
            return to[from_.index(part)]
        return part
    
    anew = re.sub(r'\d+',substitute,a)
    

    执行程序后,anew 的值将是x22 + x333 + x3333 + x2,这是预期的答案。 `

    【讨论】:

    • 没问题。我想提一下你没有考虑到的故障模式,考虑输入a = 'x12',输出应该是'x22',但是由于贪婪的正则表达式,你得到输出'x12'
    • @wim 感谢您提及这一点。我会尽快纠正。 (在 24 小时内,不能在 ATM 上进行,因为我已经在床上 315AM)。再次感谢。
    • @wim 我重新阅读了这个问题。我认为 OP 有一个带有+ 分隔值的字符串,每个值都有一个x,后跟他的from_ 列表中存在的任何值。因此,只有在from_ 列表中有12 时才会进行更改。因此,我认为这里的贪婪已经足够好了。如果需要更改,请通知我,我会尝试修改答案。
    • 好吧,我对问题的理解不同,我的感觉是输入'abc'from, to = ['ab', 'bc'], ['xy', 'yz'] 正确的输出应该是'xyc'。我不知道这是否正确,因为 OP 示例在这里没有提供足够的信息。
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多