1からPythonを学ぶスレ

このエントリーをはてなブックマークに追加
正攻法で 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"