正攻法で tr を実装してみた。エラーチェックしてないけど一応動くっぽい。
このコードは public domain に置くものとする。
import re
re_range = re.compile("(.)-(.)")
def expand_range(match):
i = ord(match.group(1))
j = ord(match.group(2))
return "".join(map(chr, range(i, j + 1)))
def expand(e):
return re_range.sub(expand_range, e)
def tr(s, f, t):
def replace(match, f=expand(f), t=expand(t)):
return t[f.index(match.group())]
r = re.compile("[" + f.replace("[", r"\\[").replace("]", r"\\]") + "]")
return r.sub(replace, s)
if __name__ == "__main__":
assert tr("ABRA-CADABRA", "ABCDR", "abcdr") == "abra-cadabra"
assert tr("ABRA-CADABRA", "A-DR", "a-dr") == "abra-cadabra"
assert tr("ABRA-CADABRA", "-A-DR", " a-dr") == "abra cadabra"
assert tr("ABRA-CADABRA", "A-DR-", "a-dr ") == "abra cadabra"