如何使用嵌套在枚举器中的多个“if”语句?

时间:2016-08-26 07:31:10

标签: python

我有一大堆字母乱七八糟,长达1.2k行。 我试图在它的两边找到一个小写字母,上面只有三个大写字母。

这是我到目前为止所拥有的

def scramble(sentence):
    try:
        for i,v in enumerate(sentence):
            if v.islower():
                if sentence[i-4].islower() and sentence[i+4].islower():
    ....
    ....
    except IndexError:
        print() #Trying to deal with the problem of reaching the end of the list


#This section is checking if 
the fourth letters before 
and after i are lowercase to ensure the central lower case letter has
exactly three upper case letters around it

但现在我陷入了下一步的困境。我想要实现的是在for-loop范围内创建(-3,4)并检查每个字母是否为大写。实际上,如果小写字母的两侧都有三个大写字母,则将其打印出来。

例如

for j in range(-3,4):
    if j != 0:
        #Some code to check if the letters in this range are uppercase
        #if j != 0 is there because we already know it is lowercase
        #because of the previous if v.islower(): statement.

如果这没有意义,如果代码按预期工作,这将是一个示例输出

scramble("abcdEFGhIJKlmnop")

输出

EFGhIJK

一个小写字母,两边都有三个大写字母。

3 个答案:

答案 0 :(得分:1)

这是一种“Python”无需执行此操作的方法 正则表达式:

s = 'abcdEFGhIJKlmnop'

words = [s[i:i+7] for i in range(len(s) - 7) if s[i:i+3].isupper() and s[i+3].islower() and s[i+4:i+7].isupper()]
print(words)

输出是:

['EFGhIJK']

这是一种使用正则表达式的方法 也就是Pythonic: - )

import re
words = re.findall(r'[A-Z]{3}[a-z][A-Z]{3}', s)

答案 1 :(得分:1)

如果你不能使用正则表达式

也许这个for循环可以做到这一点

if v.islower():
    if sentence[i-4].islower() and sentence[i+4].islower():
         for k in range(1,4):
            if sentence[i-k].islower() or sentence[i+k].islower():
                break
            if k == 3:
               return i

答案 2 :(得分:1)

正则表达式可能是最简单的,使用@Israel Unterman的修改版本来解释完整正则表达式可能是外边缘和非上层环境:

s = 'abcdEFGhIJKlmnopABCdEFGGIddFFansTBDgRRQ'

import re
words = re.findall(r'(?:^|[^A-Z])([A-Z]{3}[a-z][A-Z]{3})(?:[^A-Z]|$)', s)

# words is ['EFGhIJK', 'TBDgRRQ']

使用(?:.)组可以将搜索行开头或非上限保留在匹配组中,只在结果列表中保留所需的标记。这应该考虑OP列出的所有条件。

(删除了我以前的所有代码,因为它通常是*坏*)