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'
好的,所以我发现了一个与此类似的问题,但它侧重于将字符串拆分为两个字符对,
我想我希望能够考虑到 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'