从python字符串中删除大写字母

时间:2018-03-14 15:00:28

标签: python string

我试图弄清楚如何使用Python从字符串中删除大写字母但没有for循环。

我正在尝试使用while循环遍历列表时执行此操作。

那么如何删除提供的字符串中的大写字母?

2 个答案:

答案 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.translatere.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