Python遍历字符串将大写字母替换为#的方法及问题修复
问题根因
Python 中的字符串是不可变对象,str.replace() 方法不会修改原始字符串,只会返回执行替换操作后的新字符串。你的代码中调用 string.replace(x, "#") 后没有接收返回值,原始字符串从未被修改,因此每次打印都会输出原始内容。
除此之外你的代码还有一处逻辑问题:每次循环都打印全量字符串,最终会输出和字符串长度相等的行数,不符合替换完成后输出结果的预期。
原遍历逻辑的修复写法
如果要保留逐字符遍历判断的思路,不要尝试直接修改原字符串,可以初始化新的变量存储拼接结果:
string = "hOw Are yOu?" result = "" for x in string: if x.isupper(): result += "#" else: result += x print(result)
如果字符串长度较大,推荐用列表存储字符后再拼接,避免反复生成新字符串对象带来的性能损耗:
string = "hOw Are yOu?" res_chars = [] for x in string: res_chars.append("#" if x.isupper() else x) result = "".join(res_chars) print(result)
以上代码运行后都会输出正确结果:h#w #re y#u?
注意:不要试图在循环中写
string = string.replace(x, "#")来修改原变量,这种写法虽然在当前示例中能得到正确结果,但replace会替换字符串中所有和当前字符匹配的内容,而非仅替换当前遍历位置的字符,遇到重复大写字符的场景容易出现非预期行为。
更简洁的实现方案
不需要手动编写遍历逻辑,可以用更Pythonic的写法实现相同效果:
- 无依赖的生成器表达式写法:
string = "hOw Are yOu?" result = "".join("#" if c.isupper() else c for c in string) print(result)
- 正则替换写法(适合文本处理场景):
import re string = "hOw Are yOu?" result = re.sub(r"[A-Z]", "#", string) print(result)
内容的提问来源于stack exchange,提问作者JeromJaison
相关产品推荐
相关产品推荐

