想知道我是否朝着正确的方向前进。我必须将除字符串的最后四个字符之外的所有内容更改为#。到目前为止,我有两个想法。
第一个:
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
答案 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 )
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