3

我想用不同的字符替换字符串的每个字符,在字母表中移动。在下面的示例中,我移动了 2,因此 a -> c、b -> d 等。

我正在尝试使用正则表达式和sub函数来完成此操作,但出现错误。

这是我拥有的代码:

p = re.compile(r'(\w)')
test = p.sub(chr(ord('\\1') + 2), text)
print test

其中变量text是输入字符串。

我收到了这个错误:

TypeError: ord() 期望一个字符,但找到长度为 2 的字符串

我认为问题在于我在ord文字字符串“\1”上调用函数,而不是在\w正则表达式匹配的字符上调用该函数。这样做的正确方法是什么?

4

4 回答 4

4

它不会像这样工作。Python 首先运行chr(ord('\\') + 2,然后将该结果传递给p.sub.

您需要将其放在单独的函数中或使用匿名函数(lambda):

p = re.compile(r'(\w)')
test = p.sub(lambda m: chr(ord(m.group(1)) + 2), text)
print test

或者更好的是使用maketrans而不是正则表达式:

import string

shift = 2

t = string.maketrans(string.ascii_lowercase, string.ascii_lowercase[shift:] +
                                             string.ascii_lowercase[:shift])
string.translate(text, t)
于 2012-01-27T02:56:10.590 回答
2

完整版本

def shouldShift(char):
    return char in string.lowercase

def caesarShift(string, n):
    def letterToNum(char):
        return ord(char)-ord('a')
    def numToLetter(num):
        return chr(num+ord('a'))

    def shiftByN(char):
        return numToLetter((letterToNum(char)+n) % 26)

    return ''.join((shiftByN(c) if shouldShift(c) else c) for c in string.lower())

单线

如果你真的想要一个单线,那就是这个,但我觉得它更丑:

''.join(chr((ord(c)-ord('a')+n)%26 + ord('a')) for c in string)

演示

>>> caesarShift(string.lowercase, 3)
'defghijklmnopqrstuvwxyzabc'
于 2012-01-27T03:00:23.157 回答
1

试试这个,使用列表推导:

input = 'ABC'
''.join(chr(ord(c)+2) for c in input)
> 'CDE'

它比使用正则表达式更简单。

于 2012-01-27T03:09:31.243 回答
0
def CaesarCipher(s1,num):
new_str = ''
for i in s1:
    asc_V = ord(i)

    if asc_V in range(65, 91):
        if asc_V + num > 90:
            asc_val = 65 + (num - 1 - (90 - asc_V))
        else:
            asc_val = asc_V + num

        new_str = new_str + chr(asc_val)


    elif (asc_V in range(97, 123)):
        if asc_V + num > 122:
            asc_val = 97 + (num - 1 - (122 - asc_V))
        else:
            asc_val = asc_V + num

        new_str = new_str + chr(asc_val)

    else:
        new_str = new_str + i

return new_str        

打印(CaesarCipher(“你好”,4))

打印(CaesarCipher(“xyzderBYTE”,2))

于 2013-12-14T23:08:52.500 回答