如何实现Jaden Case字符串转换?解决撇号后字母误大写问题
嘿,我来帮你搞定这个Jaden Case的问题!首先得说说你代码里的几个小问题:
- 你的循环逻辑根本没机会发挥作用:只要遇到不是撇号的字符,就直接
return string.title()了——比如输入的第一个字符是"H",函数马上就返回title()的结果,后面的循环代码连执行的机会都没有。 - 还有个语法错误:
letter是单个字符,你不能用letter[+1]去获取下一个字符,而且Python里也没有lowercase()方法,正确的写法是lower()。另外,字符串在Python里是不可变的,你直接修改letter也不会影响原字符串哦。
解决方法1:手动处理每个单词(直观好懂)
我们可以把字符串按空格拆成单词,逐个处理每个单词的首字母,这样就能精准控制哪些字母需要大写:
def toJadenCase(string): words = string.split() jaden_words = [] for word in words: if not word: jaden_words.append(word) continue # 首字母大写,后面的字符统一转小写(撇号后的字母自然就是小写了) jaden_word = word[0].upper() + word[1:].lower() jaden_words.append(jaden_word) return ' '.join(jaden_words)
拿你的例子测试:
输入:"Hi, I'm twenty years old"
输出:"Hi, I'm Twenty Years Old"
(如果是想去掉逗号这类标点,可以在处理前加个过滤逻辑,但核心需求——撇号后字母不大写——已经完美解决啦)
解决方法2:正则表达式(简洁高效)
如果你偏爱简洁的写法,用正则匹配每个单词的开头(字符串开头或空格后的第一个字母),然后替换成大写就行:
import re def toJadenCase(string): # 只匹配字符串开头或空格后的首字母,转成大写 return re.sub(r"(^|\s)(\w)", lambda match: match.group(1) + match.group(2).upper(), string)
这个正则的逻辑很简单:(^|\s)匹配字符串开头或者空格,(\w)匹配后面的第一个字母,然后用lambda函数把这个字母转大写,再和前面的空格/开头拼接起来。这样就不会碰撇号后面的字母啦。
哦对了,顺便说下为什么你用title()会出问题:Python的str.title()会把任何非字母数字字符后的第一个字母都转成大写,所以"I'm".title()会变成"I'M"——这就是你遇到的坑啦!
内容的提问来源于stack exchange,提问作者coding girl
相关产品推荐
相关产品推荐

