白本羽 发表于 2021-4-11 10:06:59

关于python课后作业20讲动动手第1题的疑问

本帖最后由 白本羽 于 2021-4-11 10:11 编辑

请用已经学过的只是编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a)每位密码为单个小写字母
b)没为密码的左右两边均有且只有三个大写字母
passwd=''
for each in str1:
    if each.islower():   #判断取出的是否为小写字母
      position=str1.index(each)
      front=position-3
      rear=position+3
      if str1.isupper() and str1.isupper():         #判断前三位和后三位是否都为大写字母
            if str1.isupper() == False and str1.isupper() == False:         #判断前第4位和后第4位是否都不为大写字母
                passwd += each
print(passwd)
str1是小甲鱼给的字符,已经定义过了,以上是我的代码,运行没有报错,但是输出为空,不知道为什么,求解答{:5_111:} {:5_99:}

逃兵 发表于 2021-4-11 10:33:38

题目都知道补充完了,str1是啥我还是不知道

Hoiste 发表于 2021-4-11 10:35:18

应该是没有找到符合条件的字符所以输出了空。
代码有点问题,比如开头没有一句去掉分段符的问题,也就是\n\r置换成空字符,
str1 = str1.replace('\n','').replace('\r','')

阿奇_o 发表于 2021-4-11 10:35:37

str1 是怎样的?
如果只是一长串字符串,那你 for each in str1:这意味着什么,清楚?

白本羽 发表于 2021-4-11 10:45:34

逃兵 发表于 2021-4-11 10:33
题目都知道补充完了,str1是啥我还是不知道

一大串大小写混杂的英文字母,打上来就。。。

白本羽 发表于 2021-4-11 10:48:26

阿奇_o 发表于 2021-4-11 10:35
str1 是怎样的?
如果只是一长串字符串,那你 for each in str1:这意味着什么,清楚?

str1是一串很长的大小写英文字母混杂的字符串。
???不是把每一个字符都比较一下嘛,,,

Hoiste 发表于 2021-4-11 10:49:23

接着上面的说,position=str1.index(each)这句也有问题,因为一个小写字母如果前面出现过了。这个position就会一直定位到前面出现的位置,所以要么重复前面的匹配不成功,要么一直匹配前面的字符。

白本羽 发表于 2021-4-11 10:54:37

Hoiste 发表于 2021-4-11 10:35
应该是没有找到符合条件的字符所以输出了空。
代码有点问题,比如开头没有一句去掉分段符的问题,也就是\n ...

感谢你的指导!
我试了一下,返回了161个小写o,但是我根据条件目测了一下,至少应该含有一个小写g,好像还是有问题。。。

阿奇_o 发表于 2021-4-11 11:03:53

我理解应该是这样子,我就直接用正则表达式了,很方便:

In : s = 'abd#@%32309ABCpasswordXYZjk69EDFpasswwwordOPQ3-63'

In : s
Out: 'abd#@%32309ABCpasswordXYZjk69EDFpasswwwordOPQ3-63'

In : import re

In : re.findall(r'{3}(+){3}', s)
Out: ['password', 'passwwword']

逃兵 发表于 2021-4-11 11:04:15

str1 = str1.replace('\n','')
passwd=''
for each in range(len(str1)):
    if str1.islower():   #判断取出的是否为小写字母
      position=each
      front=position-3
      rear=position+3
      if str1.isupper() and str1.isupper():         #判断前三位和后三位是否都为大写字母
            if str1.isupper() == False and str1.isupper() == False:         #判断前第4位和后第4位是否都不为大写字母
                passwd += str1
print(passwd)

白本羽 发表于 2021-4-11 11:12:47

阿奇_o 发表于 2021-4-11 11:03
我理解应该是这样子,我就直接用正则表达式了,很方便:

{:5_106:}我先存起来,等之后学到了再看,再次感谢!

白本羽 发表于 2021-4-11 11:13:22

逃兵 发表于 2021-4-11 11:04


感谢回答!{:5_106:}

Hoiste 发表于 2021-4-11 11:20:52

string = string.replace('\n','').replace('\r','')

i = 3

for each in string:
    if each.islower() and string.isupper() and string.isupper():
      if string.islower() and string.islower():
            print(each,end = '')
    i += 1


我翻了下以前的代码,你参考一下有什么不同吧。

白本羽 发表于 2021-4-11 11:23:29

逃兵 发表于 2021-4-11 11:04


str1 = str1.replace('\n','').replace('\r','')
passwd=''
i=0
for each in str1:
    i += 1
    if each.islower():
      position=str1.index(each,i-1)
      front=position-3
      rear=position+3
      if str1.isupper() and str1.isupper():
            if str1.isupper() == False and str1.isupper() == False:
                passwd += each
print(passwd)
请问为什么不能直接取出each呢,为了避免重复在index里限定了起始值为i-1,用来把范围缩小,但是最终输出结果不是ilovefishc,而是aqorjisoalbkcthzoivhqemmfbtenifdwizodtzvhyasoxrazvhdclchyqurnenccoau

逃兵 发表于 2021-4-11 11:31:08

白本羽 发表于 2021-4-11 11:23
str1 = str1.replace('\n','').replace('\r','')
passwd=''
i=0


当然能用了
str1 = str1.replace('\n','').replace('\r','')
passwd=''
i=0
for each in str1:
    i += 1
    if each.islower():
      position=str1.index(each,i-1)
      front=position-3
      rear=position+3
      if str1.isupper() and str1.isupper():
            if str1.isupper() == False and str1.isupper() == False:
                passwd += each
print(passwd)

你问题出在对str1的切片处理上,你看看我切的是啥,你切的是啥
页: [1]
查看完整版本: 关于python课后作业20讲动动手第1题的疑问