python 从左到右替换字符串中的字符

python replace characters in string from left to right

好的,所以我发现了一个与此类似的问题,但它侧重于将字符串拆分为两个字符对,

我想我希望能够考虑到 2 个字符长和 4 个字符长的替换字符串的多种可能性。因此,在不拆分字符串并保持其完整的情况下,我希望能够从左到右扫描字符串,并在找到任何“匹配项”后替换它,然后继续扫描。以及首先优先考虑较长的替换集。 “0000”变成“e”而不是“aa”或“00 00”

通常的 .replace() 函数会为每个不同的值重新扫描字符串,我想避免这种情况。

这是我的脚本:

s = "0000000110110110100111111111"

x = s.replace("00","a").replace("11","b").replace("01","c").replace("10","d").replace("0000","e").replace("1111","f").replace("0101","g").replace("1010","h")

print(x)

到目前为止我的脚本生成:aaa0b0b0bcabbbb1

但我想得到结果:eacdbchcff

基于以下替换可能性:0000 00 01 10 11 01 1010 01 1111 1111

您可以将翻译放入一个字典中,并将 search-patterns 组合成一个正则表达式,这会优先考虑较长的模式。然后使用 re.sub 接受的回调参数使用字典进行替换。

import re

trans = {
    "00": "a",
    "11": "b",
    "01": "c",
    "10": "d",
    "0000": "e",
    "1111": "f",
    "0101": "g",
    "1010": "h"
}

regex = "|".join(sorted(trans.keys(), key=len, reverse=True))

# demo
s =  "0000000110110110100111111111"
result = re.sub(regex, lambda x: trans[x.group(0)], s)
print(result)  # eacdbchcff

Non-regex 方法是将每个部分评估为一组 4 个字符,查看是否匹配这些字符,或者将 4 个字符分成两半并为它们匹配...

replacements = {'0000': 'e', '1111': 'f', '1010': 'h', '0101': 'g', '10': 'd', '01': 'c', '11': 'b', '00': 'a'}
s = "0000000110110110100111111111"
r_d = replacement_dict  # only here to shorten comprehension

for i in range(0, len(s), 4):
     print(r_d.get(s[i:i+4], r_d.get(s[i:i+2], "") +r_d.get(s[i+2:i+4],"")), end="")

或者用循环作为列表推导

"".join(r_d.get(s[i:i+4], r_d.get(s[i:i+2], "") +r_d.get(s[i+2:i+4], "")) for i in range(0, len(s), 4))
'eacdbcddcff'