用'#'改变字符串的部分

时间:2015-07-17 09:33:31

标签: python string

想知道我是否朝着正确的方向前进。我必须将除字符串的最后四个字符之外的所有内容更改为#。到目前为止,我有两个想法。

第一个:

def maskify(cc):
   cc = raw_input("Enter passcode: ")
   n = len(cc)
   cc.replace(cc[0:n-4], #)  # this one gives me the unexpected EOF while parsing error

第二个(我认为这个更接近因为它应该需要算法):

def maskify(cc):
   cc = raw_input("Enter passcode: ")  
   n = len(cc)
   for i in range (0, n-4):  # i think a for loop would be good but i don't know how i'm going to use it yet
      cc.replace(                  #not entirely sure what to put here
   pass                           

9 个答案:

答案 0 :(得分:3)

cc = raw_input("Enter passcode: ")
cc = ''.join(('#' * (len(cc) - 4), cc[-4:]))

答案 1 :(得分:2)

第一个示例中的问题是#未加引号。您需要将其更改为'#',否则将其解析为注释的开头,并且括号括号是该注释的一部分。虽然,这只会修复解析错误。

字符串的问题在于您无法更改其中的字符(它们是immutable)。解决此问题的常用方法是创建字符串数组,更改要更改的字符,然后将数组转换回字符串(通常使用''.join(character_array))。试试吧!

答案 2 :(得分:2)

以下情况如何?

def maskify() :
    cc = input("Enter passcode: ")
    mask = '#'*(len(cc)-4)
    return mask + cc[-4:]

我不确定你程序的其余部分是如何工作的,但是我怀疑你是否应该在这个函数内部提示raw_input。您可以根据需要决定。替代方案看起来像这样:

def maskify(cc) :
    return '#'*(len(cc)-4) + cc[-4:]

myInput = input("Enter passcode: ")
maskedInput = maskify( myInput )
  • 注意:python2使用raw_input代替input

答案 3 :(得分:1)

对您自己的代码稍作修改:

cc = raw_input("Enter passcode: ")  
n = len(cc)
c=""
for i in range(0, n-4):  # i think a for loop would be good but i don't know how i'm going to use it yet
    c+="#"               #not entirely sure what to put here
cc= c+cc [-4:]
print cc

<强>输出:

Enter passcode: kased
#ased

答案 4 :(得分:1)

以下解决方案假设这将使用安全类型,因为这样的4个或更少字符的密码应该被散列,否则有人会知道整个密码。

def maskify(cc):
    if len(cc) < 9:
        split = [0,1,2,3,4,4,4,4,4][len(cc)]
    else:
        split = len(cc) - 4

    return "#" * split + cc[split:]

for length in range(1,12):
    test = string.lowercase[:length]
    print "%s > %s" % (test, maskify(test))

给出以下结果:

a > #
ab > ##
abc > ###
abcd > ####
abcde > ####e
abcdef > ####ef
abcdefg > ####efg
abcdefgh > ####efgh
abcdefghi > #####fghi
abcdefghij > ######ghij
abcdefghijk > #######hijk

如果不需要短哈希,那么只需按如下方式更改数组即可获得其他结果:

def maskify(cc):
    if len(cc) < 9:
        split = [0,0,0,0,0,1,2,3,4][len(cc)]
    else:
        split = len(cc) - 4

    return "#" * split + cc[split:]

,并提供:

a > a
ab > ab
abc > abc
abcd > abcd
abcde > #bcde
abcdef > ##cdef
abcdefg > ###defg
abcdefgh > ####efgh
abcdefghi > #####fghi
abcdefghij > ######ghij
abcdefghijk > #######hijk

答案 5 :(得分:0)

字符串文字'#'与开始内联注释的字符#不同。

def maskify(cc):
   cc = raw_input("Enter passcode: ")  
   mask = '#'*(len(cc)-4)
   return mask + cc[-4:]

答案 6 :(得分:0)

正如其他人提到的那样#开始发表评论。如果你想要一个包含哈希的字符串,你需要做'#'

正如AndréLaszlo所说,Python字符串是不可变的,因此字符串操作改变字符串的内容是不可能的。因此str.replace()方法无法更改原始字符串:它需要创建一个新字符串,该字符串是原始字符串的修改版本。

所以,如果你这样做

cc = 'cat'
cc.replace('c', 'b')

然后Python会创建一个包含'bat'的新字符串,因为你没有把它保存在任何地方而被丢弃。

相反,你需要做类似

的事情
cc = 'cat'
cc = cc.replace('c', 'b')

这会丢弃绑定到名称'cat'的原始字符串对象cc,并将新字符串'bat'绑定到它。

解决问题的最佳方法(AFAIK)在bebop的回答中给出。这是bebop代码的略微修改版本,显示它正确处理短字符串(包括空字符串)。

def maskify(s) :
    return '#' * (len(s) - 4) + s[-4:]

alpha = 'abcdefghij'
data = [alpha[:i] for i in range(len(alpha)+1)]

for s in data:
    print((s, maskify(s)))

<强>输出

('', '')
('a', 'a')
('ab', 'ab')
('abc', 'abc')
('abcd', 'abcd')
('abcde', '#bcde')
('abcdef', '##cdef')
('abcdefg', '###defg')
('abcdefgh', '####efgh')
('abcdefghi', '#####fghi')
('abcdefghij', '######ghij')

答案 7 :(得分:0)

首先创建的字符串是不可变的(它们无法更改) - 因此您无法使用 replace()更改cc的值。要更改除最后四个字符串以外的字符串的所有部分,请执行以下操作:

def doso(text):
  assert len(str(text))>4, 'Length of text should be >4'
  ctext=str(text).replace(str(text)[:(len(str(text))-4)],'#'*(len(str(text))-4)) 
  print(ctext)

>>>doso(123) prints 'Length of text should be >4' because len(text)== 3 which is what we expect

Hovever,

 >>>doso(12345678) prints #####6789 which is exactly what we expect

注意:执行'#'*(len(str(text)) - 4))说明我们要替换的字符数

答案 8 :(得分:0)

# return masked string
def maskify(cc):

    maskify = cc
    maskifyL= len(maskify) - 4

    char = ""
    a=0

    if maskifyL <= 2:
       c2 = cc
    else:
        for a in range(maskifyL):
            char += "#"
            a += 1
        c2 = maskify.replace(maskify[:maskifyL], char, maskifyL)

    return c2