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