如何在python 3中查找字符串中的大写和小写字符分组

时间:2016-06-05 00:19:19

标签: python string

我正在研究Python挑战赛,我正在上课要求我们找到一个小写字母,两边用三个大写字母包围。我写了下面的代码,看起来很粗糙,但我觉得应该工作。但是,我得到的只是一个空字符串。

source="Hello there" #the string I have to work with
key=""#where I want to put the characters that fit
for i in source:
    if i==i.lower(): # if it's uppercase
        x=source.index(i) #makes number that's the index of i
        if source[x-1].upper()==source[x-1] and source[x-2]==source[x-2].upper() and source[x-3].upper()==source[x-3]: #checks that the three numbers before it are upper case
            if source[x+1].upper()==source[x+1] and source[x+2].upper()==source[x+2] and source[x+3].upper()==source[x+3]: #checks three numbers after are uppercase
                if source[x+4].lower()==source[x=4] and source[x-4].lower()==source[x-4]: #checks that the fourth numbers are lowercase
                key+=i #adds the character to key
print(key)

我知道这真的非常混乱,但我不明白为什么它只返回一个空字符串。如果你知道什么是错的,或者更有效的方法,我会非常感激。感谢

2 个答案:

答案 0 :(得分:0)

使用正则表达式,这要容易得多。

re.findall(r'(?<![A-Z])[A-Z]{3}([a-z])(?=[A-Z]{3}(?:\Z|[^A-Z]))', text)

以下是它的工作原理:

  • (?<![A-Z])是一个负面的后置断言,它确保我们前面没有大写字母。

  • [A-Z]{3}是三个大写字母。

  • ([a-z])是我们正在寻找的小写字母。

  • (?=[A-Z]{3}(?:\Z|[^A-Z]))前瞻断言,确保我们后跟三个大写字母,但不是四个。

您可能需要根据实际想要查找的内容更改分组。这会找到小写字母。

答案 1 :(得分:0)

我建议使用itertools.groupby方法和keyfunc来区分小写字母和大写字母。

首先,你需要一个辅助函数来重构检查逻辑:

def check(subseq):
    return (subseq[0][0] and len(subseq[0][1]) == 3
            and len(subseq[1][1]) == 1
            and len(subseq[2][1]) == 3)

然后分组并检查:

def findNeedle(mystr):
    seq = [(k,list(g)) for k,g in groupby(mystr, str.isupper)]
    for i in range(len(seq) - 2):
        if check(seq[i:i+3]):
            return seq[i+1][1][0]

检查解释器中的seq以查看其工作原理,应该非常清楚。

编辑:有些拼写错误,我没有测试代码。

现在进行测试:

>>> findNeedle("Hello there HELxOTHere")
'x'