如何在python中用大写字母更改单词的第i个字母



我想用大写字母更改每个单词的倒数第二个字母。但当我的句子中包含一个只有一个字母的单词时,程序会给出一个错误(IndexError:字符串索引超出范围(。这是我的密码。它适用于多个字母的单词。例如,如果我写str=";Python是最好的编程语言;它会起作用的,因为没有任何单词带有(一个(字母。

str ="I Like Studying Python Programming"
array1=str.split()
result =[]
for i in array1:
result.append(i[:-2].lower()+i[-2].upper()+i[-1].lower())
print(" ".join(result))

您的问题非常适合使用正则表达式,所以我建议在这里:

str = " I Like Studying Python Programming"
output = re.sub(r'(w)(?=wb)', lambda m: m.group(1).upper(), str)
print(output)

此打印:

I LiKe StudyiNg PythOn ProgrammiNg

请注意,这种方法不会针对任何单个字母的单词,因为它们后面不会跟着另一个单词字符。

使用正则表达式的另一个选项是缩小只使用大写字母的字符的匹配范围,使用否定字符类[^W_d]来匹配除数字或下划线之外的单词字符,然后匹配非空白字符

例如,这将使a)大写为A),但与3d中的3不匹配

解释

[^W_d](?=S(?!S))
  • [^W_d]匹配除_或数字之外的单词字符
  • (?=积极前瞻,断言直接右边的是
    • S(?!S)匹配后面跟着空白边界的非空白字符
  • )关闭前瞻

查看regex演示和Python演示

示例

import re
regex = r"[^W_d](?=S(?!S))"
s = ("I Like Studying Python Programmingnn"
"a) This is a test with 3dn")
output = re.sub(regex, lambda m: m.group(0).upper(), s)
print(output)

输出

I LiKe StudyiNg PythOn ProgrammiNg
A) ThIs Is a teSt wiTh 3d

使用PyPi正则表达式模块,您还可以使用p{Ll}来匹配具有大写变体的小写字母。

p{Ll}(?=S(?!S))

查看regex演示和Python演示

简单检查每个单词的长度是否大于1,然后将倒数第二个字母转换为大写并将其附加到变量result中,如果单词的长度为1,则将单词原样附加到结果变量中。

这是代码:

str ="I Like Studying Python Programming"
array1=str.split()
result =[]
for i in array1:
if len(i) > 1:
result.append(i[:-2].lower()+i[-2].upper()+i[-1].lower())
else:
result.append(i)
print(" ".join(result))

最新更新