2013-12-14 99 views

回答

6

不知道你有多快需要这个,但如果你正在寻找最快的解决方案在那里。在Python字符串模块的translate功能是一个稍微迂回,但通常更高性能的方法:

import string 

transtab = string.maketrans(string.uppercase, '*'*len(string.uppercase)) 
"aBCd3Fg".translate(transtab) 

>>>'a**d3*g' 

我总是有多少人不知道这一招惊讶。一个在蟒蛇的最佳保守的秘密IMO

+0

这应该是我的建议。 – mgilson

+0

@mgilson很高兴听到它,比正则表达式更少,而2-5速度更快,复杂性也更低。 –

5
import re 

print re.sub(r'[A-Z]', '*', "aBCd3Fg") 
2
string = ''.join(['*' if x.isupper() else x for x in string]) 
+0

有趣的事实:如果你渴望有一个C风格的条件运算符,可以缩短你的表达'“*”如果r == r.upper()其他r'与相当于'(r,'*')[r.isupper()]'。 –

+0

@DarrenStone - 这将消除三元的短路特性,并且需要更长的时间来处理。 :) – iCodez

+0

@DarrenStone,我知道这个语法,但它通常被大多数python用户所不悦。 – smac89

-3

你也可以这样做:

for x in myString: 
    if (x == 'A','B','C','D','E','F','G','H','I','J','K','L','M', 
    'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'" 
     x = '*' 

这是一个很短的一段代码,将做的工作。

+0

为什么所有的负面反馈?这不是一个合法的答案吗? – kiasy

+0

我不是一个downvoter,但这个答案并不是很短,并且不会像所显示的那样完成工作。 – Robert

0

一个简单的办法:

input = "aBCd3Fg" 
output = "".join(['*' if 'A' <= char <= 'Z' else char for char in input ]) 
#Long version 
input = "aBCd3Fg" 
output = '' 
for char in input: 
    output = output + '*' if ord('A') <= ord(char) <= ord('Z') else output + char 
print output 
相关问题