【问题标题】:Python translate with multiple charactersPython 翻译多个字符
【发布时间】:2014-10-01 20:17:24
【问题描述】:

我正在尝试在 python 3.3.3 中创建一个程序,它将接受一个字符串然后将其转换为数字 (1-26)

我知道怎么做一个数字,但不是 2

translist = str.maketrans("123456789", "ABCDEFGHI")

有没有办法做到这一点

【问题讨论】:

    标签: python string python-3.x translate


    【解决方案1】:

    你不能用str.translate()做你想做的事;这只适用于一对一的替换。您试图在此处用 两个不同的字符替换一个字符。

    您可以改用正则表达式:

    re.sub('[A-Z]', lambda m: str(ord(m.group()) - 64), inputstring)
    

    这需要每个字母的 ASCII 码位并减去 64(A 在 ASCII 标准中是 65)。

    请注意,这可能会导致一些令人困惑的模棱两可的解释:

    >>> import re
    >>> inputstring = 'FOO BAR BAZ'
    >>> re.sub('[A-Z]', lambda m: str(ord(m.group()) - 64), inputstring)
    '61515 2118 2126'
    

    第一组数字是6 1 5 1 5 还是6 15 15?你可能想用 0 填充你的数字:

    re.sub('[A-Z]', lambda m: format(ord(m.group()) - 64, '02d'), inputstring)
    

    产生:

    >>> re.sub('[A-Z]', lambda m: format(ord(m.group()) - 64, '02d'), inputstring)
    '061515 020118 020126'
    

    【讨论】:

    • 我尝试将第二段代码通过 shell,它说“语法错误:编译单个语句时发现多个语句”我该如何解决这个问题?
    • @Sam:这听起来好像 Python 在一行代码中找到了额外的信息;确保您的 () 括号正确平衡。
    • 我在其他地方找到了一个可行的答案,但感谢您的帮助。
    • @Sam:请注意,那里的答案假设您要替换字符串中的 所有 个字符(不仅仅是字母)。
    【解决方案2】:

    您可以使用列表推导、格式和映射:

    >>> s='ABCXYZ'
    >>> [format(oc, '02d') for oc in map(ord, s)]
    ['65', '66', '67', '88', '89', '90']
    

    如果您愿意,可以将其重新加入一个字符串:

    >>> ''.join([format(oc, '02d') for oc in map(ord, s)])
    '656667888990'
    

    【讨论】:

      【解决方案3】:

      最近我遇到了和 Sam 一样的问题。所以我搜索了一些关键字并找到了我的解决方案。

      http://code.activestate.com/recipes/81330-single-pass-multiple-replace/

      顺便说一句,这种方法可能会慢一点,但对我的情况很有用。

      希望对您有所帮助,并为我的英语不好感到抱歉。

      【讨论】:

        【解决方案4】:

        我绝不是最好的 Python 程序员(我的旅程仍在开始),但是这段代码似乎可以满足您的需求。

        首先,制作一个像这样的字典:

        abc = {"A": "1",
           "B": "2",
           "C": "3",
           "D": "4",
           "E": "5",
           "F": "6",
           "G": "7",
           "H": "8",
           "I": "9",
           "J": "10",
           "K": "11",
           "L": "12",
           "M": "13",
           "N": "14",
           "O": "15", 
           "P": "16",
           "Q": "17",
           "R": "18",
           "S": "19",
           "T": "20",
           "U": "21",
           "V": "22",
           "W": "23",
           "X": "24",
           "Y": "25",
           "Z": "26"}
        

        那么你可以这样做:

        txt = str(input("Text: ")).upper()
        ntxt = ""
        
        for char in txt:
            if char in abc:
                ntxt += abc[char]
            else:
                ntxt += char
        
        print("New string:", ntxt)
        

        【讨论】:

          【解决方案5】:

          我也有同样的问题要解决,并且能够用 oneliner 解决它:

          def replace(s, r):
              return ''.join([r.get(x, x) for x in s])
          

          此函数采用要迭代的字符串和替换字典,键是要查找的字符,值是替换字符。理解遍历字符串的字符,如果字符是替换字典中的键,它将使用该值,否则只返回字符。然后我们用join 函数将它收集回一个字符串。

          我的用例是编写一个简单的 url percent-encoder:

          def url_encode(s):
              r = {
                      "!":"%21",
                      "#":"%23",
                      "$":"%24",
                      "%":"%25",
                      "&":"%26",
                      "'":"%27",
                      "(":"%28",
                      ")":"%29",
                      "*":"%2A",
                      "+":"%2B",
                      ",":"%2C",
                      "/":"%2F",
                      ":":"%3A",
                      ";":"%3B",
                      "=":"%3D",
                      "?":"%3F",
                      "@":"%40",
                      "[":"%5B",
                      "]":"%5D",
                  }
              return replace(s, r)
          
          def replace(s, r):
              return ''.join([r.get(x, x) for x in s])
          
          

          【讨论】:

            猜你喜欢
            • 2017-03-11
            • 1970-01-01
            • 2018-02-05
            • 2020-01-20
            • 1970-01-01
            • 2021-07-04
            • 2017-11-13
            • 1970-01-01
            相关资源
            最近更新 更多