Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python挑战3:循环停止得太早了_Python_Loops - Fatal编程技术网

Python挑战3:循环停止得太早了

Python挑战3:循环停止得太早了,python,loops,Python,Loops,我在做PythonChallenge#3。我有一大段文字要整理。我试图找到一个序列,其中第一个和最后三个字母是大写字母,中间一个是小写字母 我的函数在文本中循环。变量块存储当前循环的七个字母。有一个变量toPrint,它根据块中的字母是否对应于我的模式(aaaaaaaaa)来打开和关闭。基于根据我的函数打印的最后一块,我的循环在我的文本中提前停止。我不知道为什么会发生这种情况,如果你能帮我弄清楚,那就太好了 text = """kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzx

我在做PythonChallenge#3。我有一大段文字要整理。我试图找到一个序列,其中第一个和最后三个字母是大写字母,中间一个是小写字母

我的函数在文本中循环。变量块存储当前循环的七个字母。有一个变量toPrint,它根据块中的字母是否对应于我的模式(aaaaaaaaa)来打开和关闭。基于根据我的函数打印的最后一块,我的循环在我的文本中提前停止。我不知道为什么会发生这种情况,如果你能帮我弄清楚,那就太好了

text = """kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJ"""
words = []
for i in text:
    toPrint = True
    block = text[text.index(i):text.index(i)+7]
    for b in block[:3]:
        if b.isupper() == False:
            toPrint = False
    for b in block[3]:
        if b.islower() == False:
            toPrint = False
    for b in block[4:]:
        if b.isupper() == False:
            toPrint = False
    if toPrint == True and block not in words:
        words.append(block)
print (block)
print (words)
使用正则表达式: 现在正是使用正则表达式的好时机,它非常快,更清晰,并且不需要一堆嵌套的if语句

import re
text = """kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJ"""
print(re.search(r"[A-Z]{3}[a-z][A-Z]{3}", text).group(0))
正则表达式的解释:
[A-Z]{3]-->匹配任意3个大写字母
[a-z]------>匹配单个小写字母
[A-Z]{3]-->匹配3个以上的大写字母


没有正则表达式: 如果你真的不想使用正则表达式,你可以这样做:

text = """kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJ"""

for i, _ in enumerate(text[:-6]): #loop through index of each char (not including last 6)
    sevenCharacters = text[i:i+7] #create chunk of seven characters
    shouldBeCapital = sevenCharacters[0:3] + sevenCharacters[4:7] #combine all the chars that should be cap into list

    if (all(char.isupper() for char in shouldBeCapital)): #make sure all those characters are indeeed capital
        if(sevenCharacters[3].islower()): #make sure middle character is lowercase
            print(sevenCharacters)

如果我理解了你的问题,那么根据我的观点,就不需要循环。我的这个简单的代码可以找到所需的序列

# Use this code

text = """kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJ"""

import re

print(re.findall("[A-Z]{3}[a-z][A-Z]{3}", text))

我认为您的第一个问题是您正在使用
str.index()
。与
find()
类似,字符串的
.index()
方法返回找到的第一个匹配项的索引

因此,在您的示例中,无论何时搜索“x”,您都将获得找到的第一个“x”的索引等。您无法成功使用字符串中不唯一的字符,或者不是重复字符的第一次出现的字符

为了保持相同的结构(这是不必要的——我更喜欢使用enumerate发布答案),我使用块变量实现了一种排队方法。每次迭代,从块的前面删除一个字符,同时将新字符追加到块的末尾

我还清理了一些与
False
不必要的比较。您会发现,这不仅效率低下,而且常常是错误的,因为许多“布尔值”您执行的活动将不会基于实际的布尔值。请摆脱拼写
True/False
的习惯。如果是c则使用
,如果不是c
则使用

结果如下:

text = """kAewtloYgcFQaJNhHVGxXDiQmzjfcpYbzxlWrVcqsmUbCunkfxZWDZjUZMiGqhRRiUvGmYmvnJ"""
words = []
block = '.' + text[0:6]
for i in text[6:]:
    block = block[1:] + i  # Drop 1st char, append 'i'
    toPrint = True
    for b in block[:3]:
        if not b.isupper():
            toPrint = False
    if not block[3].islower():
        toPrint = False
    for b in block[4:]:
        if not b.isupper():
            toPrint = False
    if toPrint and block not in words:
        words.append(block)
print (words)

你可以使用正则表达式吗?对不起,兄弟,当我回答这个问题时,这个问题没有答案。这有点不同。它返回符合条件的所有7个字母的块,而另一个函数只返回一个。谢谢,这非常好用!