【问题标题】:Complement maketrans in python for translate在python中补充maketrans进行翻译
【发布时间】:2022-01-06 06:18:20
【问题描述】:

为了将 perl 中的 tr 翻译成 python,我使用了 string.maketransstr.translate。但是,对于 perl 表达式:

$val =~ tr/\0-\377//c

用户要求翻译的补充。我如何为此生成 python 代码?

【问题讨论】:

  • 更好的表述问题的方法:“如何计算字符串中超出范围 00..FF 的字符数?”
  • 这只是一个示例输入 - 用户可以在其中放置任何内容。我的程序叫做“pythonizer”,它把 perl 翻译成 python。另外,我认为这种情况会删除所有不在 00..FF 中的字符。
  • Re "另外我认为这种情况会删除所有不在 00..FF 中的字符。",它没有。 /// Re "这只是一个示例输入",提供 tr 的 Python 实现 /// 超出了 SO 的范围。
  • 有些人给了我关于如何处理它的子案例的想法,我可以匹配和生成 - 见下文!
  • 你特别说你不想只处理这一种情况,而答案甚至没有正确处理这一种情况。

标签: python perl translate tr


【解决方案1】:

我假设你想删除不在序数值 [0-255] 范围内的字符,那么你可以简单地这样做

val = "".join([ch for ch in val if 0o000 <= ord(ch)<= 0o377])

【讨论】:

  • Re "我假设你想删除字符",tr/\0-\377//c 不会删除任何字符。
  • @ikegami 是的,我同意,我认为他们想删除不算数。
  • 奇怪的假设。但无论如何,他们澄清说他们正在编写一个翻译器,并希望在 Python 中处理任何 tr///c(可能还有任何 tr///)。
  • 感谢@ikegami - 在我写了一个小测试用例之前,我在查看 perl 代码时做出了同样的错误假设(请参阅上面的评论)。它不会改变 $val,它只是计算不在范围内的字符。
  • 好的,如果用户还指定了“d”标志,这个翻译将起作用。
【解决方案2】:

这是我在perllib 中实现的:

def _maketrans_c(arg1, arg2, delete=False):
    """Make a complement tr table for the 'c' flag.  If the 'd' flag is passed, then delete=True.  Ranges are expanded in arg1 and arg2 but arg2 is not otherwise normalized"""
    t = str.maketrans(arg1, arg1)
    d = dict()
    for i in range(257):
        if i not in t:
            if not arg2:
                if delete:
                    d[i] = None
                else:
                    d[i] = i
            elif i < len(arg2):
                d[i] = arg2[i]
            elif delete:
                d[i] = None
            else:
                d[i] = arg2[-1]

    return str.maketrans(d)


def _translate_and_count(table, var, replace=True, complement=False, delete=False, squash=False):
    """Perform a tr translate, but also count the # of matches"""
    result = []
    ctr = 0;
    pv = None
    for ch in var:
        if ord(ch) > 256 and complement:
            ch = chr(256)
        try:
            v = table[ord(ch)]
            ctr += 1
        except LookupError:
            v = ch
            pv = None
        if v is not None:
            if isinstance(v, int):
                v = chr(v)
            if pv != v or not squash:
                result.append(v)
        pv = v
    if not replace:
        return (var, ''.join(result))
    return (''.join(result), ctr)

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多