如何忽略大写但是返回与输入相同的大小写

时间:2016-10-11 19:43:21

标签: python string case

我的代码打算识别第一个非重复字符串字符,空字符串,重复字符串(即abbaaa),但它也意味着处理大小写输入相同的字符,同时在其输入的原始情况下返回准确的非重复字符。

def first_non_repeat(string):
    order = []
    counts = {}
    for x in string:
        if x in counts and x.islower() == True:
            counts[x] += 1
        else:
            counts[x] = 1 
            order.append(x)
    for x in order:
        if counts[x] == 1:
            return x
    return ''

我在第5行的逻辑是,如果我将所有字母输入设为小写,那么它将遍历字符串输入并且不区分大小写。但截至目前,当我真正需要'sTreSS'时,请输入's'并输出'T'。如果最后两个S是小写的,那么它将是'T'但我需要足够灵活的代码来处理任何案例输入。

3 个答案:

答案 0 :(得分:0)

比较两个字母时,使用lower()比较字符串中的字符。一个例子是:

includes?

答案 1 :(得分:0)

重点是x中的counts是以不区分大小写的方式搜索的。您必须实现自己的不区分大小写的Dictionary,或使用正则表达式来检测重复的字母:

import re
def first_non_repeat(string):
    r = re.compile(r'([a-z])(?=.*\1)', re.I|re.S)
    m = r.search(string)
    while m:
        string = re.sub(m.group(1), '', string, re.I)
        m = r.search(string)
    return string[0]

print(first_non_repeat('sTreSS'))

请参阅Python demo

([a-z])(?=.*\1)正则表达式找到也出现在前方的任何ASCII字母(请注意([a-z]) 将字符捕获到第1组,(?=.*\1)是预告其中\1匹配在与.*模式匹配的任何0+字符后捕获到组1中的相同字符,re.S标记有助于支持包含换行符的字符串。)

re.sub会以不区分大小写的方式删除所有找到的字母,因此我们只会在string阻止后的while中获取唯一字符。

答案 2 :(得分:0)

您可以对代码进行一些小改动以使其正常工作。

 def first_non_repeat(string):
            order = []
            counts = {}
            for x in string:

                char_to_look = x.lower()   #### convert to lowercase for all operations

                if char_to_look in counts :
                    counts[char_to_look] += 1

                else:
                    counts[char_to_look] = 1 
                    order.append(char_to_look)

           for x in string:   ### search in the string instead or order, character and order will remain the same, except the case. So again do x.lower() to search in count
                if counts[x.lower()] == 1:
                    return x
            return ''1