You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

优化后的代码及说明

原代码问题点:

  1. 用re.sub将所有非字母数字字符替换为空格,破坏了原始字符串的分隔逻辑
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:45:37