我试图弄清楚如何使用Python从字符串中删除大写字母但没有for
循环。
我正在尝试使用while
循环遍历列表时执行此操作。
那么如何删除提供的字符串中的大写字母?
答案 0 :(得分:2)
你有几个选择:
1)如果您只是想将所有大写字母转换为小写字母,那么.lower()
是最简单的方法。
s = 'ThiS iS A PyTHon StrinG witH SomE CAPitaL LettErs'
给出:
this is a python string with some capital letters
2)如果你想完全删除它们,那么re.sub()
是一种简单的方法。
import re
print(re.sub(r'[A-Z]', '', s))
给出:
hi i yon trin wit om ita ettrs
3)
对于字符串列表,您可以使用列表解析:
#Option1
[i.lower() for i in s])
#Option2
import re
[re.sub(r'[A-Z]', '', i) for i in s])
#Option3 (as mentioned by @JohnColeman)
[''.join([j for j in i if not j.isupper()]) for i in s]
答案 1 :(得分:2)
字符串是不可变的,所以你不能从字面上删除字符,但你可以创建一个跳过这些字符的新字符串。
最简单的方法是:
s = ''.join(ch for ch in s if not ch.isupper())
如果你想在没有for
的情况下出于某种原因(比如作业要求),我们可以将其作为显式循环写出来,然后将其转换为while
。所以:
result = []
for ch in s:
if not ch.isupper(): result.append(ch)
s = ''.join(result)
要更改循环,我们必须手动设置并接下来使用迭代器,但是使用普通的int作为索引而不是迭代器可能更容易理解:
result = []
i = 0
while i < len(s):
ch = s[i]
if not ch.isupper(): result.append(ch)
i += 1
s = ''.join(result)
当然,这更加冗长,效率稍低,容易出错,但除此之外基本相同,它符合您的奇怪要求。
在现实生活中,可能有更好的方法可以做到这一点 - 例如,如果您只关心ASCII上限,str.translate
带有从全部大写到无的地图应该非常快 - 但我认为你的老师没有你希望你在那些方向思考,他们希望你明确地思考循环。 (当然在str.translate
或re.sub
等中有一个循环,该循环只是隐藏在你看不到它的封面下。)
如果你需要对列表中的多个字符串执行此操作,则将其包装在函数中,并使用理解将其应用于列表中的每个字符串 - 或者可以将其作为循环语句写出来,如果您愿意,将其转换为while
循环,方式完全相同。例如:
def remove_caps(s):
result = []
i = 0
while i < len(s):
ch = s[i]
if not ch.isupper(): result.append(ch)
i += 1
return ''.join(result)
strings = ['aBC', 'Abc', 'abc', '']
new_strings = []
i = 0
while i < len(strings):
new_strings.append(remove_caps(strings[i]))
i += 1