Python字符串首字母大写优化:数字开头单词不转大写的问题修复
要求确保护照上人名的姓和名首字母大写。例如,alison heck应正确转换为Alison Heck。
注意:仅单词的第一个字符大写。例如12abc大写后仍为12abc。
测试用例失败情况
- 输入:
1 w 2 r 3g
- 预期输出:
1 W 2 R 3g
- 当前输出:
1 W 2 R 3G
需要优化的代码
import math import os import random import re import sys def solve(s): x = re.sub("[^A-Za-z0-9]", " ", s) a = x.title() return a if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') s = input() result = solve(s) fptr.write(result + '\n') fptr.close()
优化后的代码及说明
原代码问题点:
- 用
re.sub将所有非字母数字字符替换为空格,破坏了原始字符串的分隔逻辑 str.title()会把每个单词的首字符(无论是否为字母)大写,导致3g这类首字符是数字的序列被错误转为3G
优化思路:针对每个连续的字母数字序列(即需求中的“单词”),仅当序列首字符是小写字母时才将其大写,其余情况保持原样。
修改后的代码:
import os import re import sys def solve(s): def process_token(token): # 仅当token首字符是小写字母时,将其大写,其余部分保持不变 if token and token[0].islower(): return token[0].upper() + token[1:] return token # 匹配所有连续的字母数字序列,逐个处理后替换回原字符串 return re.sub(r'\w+', lambda m: process_token(m.group()), s) if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') s = input() result = solve(s) fptr.write(result + '\n') fptr.close()
关键说明
- 正则
\w+匹配所有连续的字母数字/下划线序列,符合需求中的“单词”定义 - 自定义
process_token函数精准处理每个序列:仅首字符为小写字母时执行大写转换 - 保留原始字符串中的非字母数字分隔符(比如空格),无需提前替换
内容的提问来源于stack exchange,提问作者Abhishek Singh Yadav
相关产品推荐
相关产品推荐

