鱼C论坛

 找回密码
 立即注册
查看: 1460|回复: 14

[已解决]关于python课后作业20讲动动手第1题的疑问

[复制链接]
发表于 2021-4-11 10:06:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 白本羽 于 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[front:position-1].isupper() and str1[position+1:rear].isupper():         #判断前三位和后三位是否都为大写字母
            if str1[front-1].isupper() == False and str1[rear+1].isupper() == False:         #判断前第4位和后第4位是否都不为大写字母
                passwd += each
print(passwd)
str1是小甲鱼给的字符,已经定义过了,以上是我的代码,运行没有报错,但是输出为空,不知道为什么,求解答
最佳答案
2021-4-11 11:31:08
白本羽 发表于 2021-4-11 11:23
str1 = str1.replace('\n','').replace('\r','')
passwd=''
i=0

当然能用了
  1. str1 = str1.replace('\n','').replace('\r','')
  2. passwd=''
  3. i=0
  4. for each in str1:
  5.     i += 1
  6.     if each.islower():
  7.         position=str1.index(each,i-1)
  8.         front=position-3
  9.         rear=position+3
  10.         if str1[front:position].isupper() and str1[position+1:rear+1].isupper():
  11.             if str1[front-1].isupper() == False and str1[rear+1].isupper() == False:
  12.                 passwd += each
  13. print(passwd)
复制代码


你问题出在对str1的切片处理上,你看看我切的是啥,你切的是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-11 10:33:38 | 显示全部楼层
题目都知道补充完了,str1是啥我还是不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 10:35:18 | 显示全部楼层
应该是没有找到符合条件的字符所以输出了空。
代码有点问题,比如开头没有一句去掉分段符的问题,也就是\n\r置换成空字符,
str1 = str1.replace('\n','').replace('\r','')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 10:35:37 | 显示全部楼层
str1 是怎样的?
如果只是一长串字符串,那你 for each in str1:  这意味着什么,清楚?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-11 10:45:34 | 显示全部楼层
逃兵 发表于 2021-4-11 10:33
题目都知道补充完了,str1是啥我还是不知道

一大串大小写混杂的英文字母,打上来就。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

str1是一串很长的大小写英文字母混杂的字符串。
???不是把每一个字符都比较一下嘛,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 10:49:23 | 显示全部楼层
接着上面的说,position=str1.index(each)这句也有问题,因为一个小写字母如果前面出现过了。这个position就会一直定位到前面出现的位置,所以要么重复前面的匹配不成功,要么一直匹配前面的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢你的指导!
我试了一下,返回了161个小写o,但是我根据条件目测了一下,至少应该含有一个小写g,好像还是有问题。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 11:03:53 | 显示全部楼层
我理解应该是这样子,我就直接用正则表达式了,很方便:

  1. In [14]: s = 'abd#@%32309ABCpasswordXYZjk69EDFpasswwwordOPQ3-63'

  2. In [15]: s
  3. Out[15]: 'abd#@%32309ABCpasswordXYZjk69EDFpasswwwordOPQ3-63'

  4. In [16]: import re

  5. In [17]: re.findall(r'[A-Z]{3}([a-z]+)[A-Z]{3}', s)
  6. Out[17]: ['password', 'passwwword']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-11 11:04:15 | 显示全部楼层
  1. str1 = str1.replace('\n','')
  2. passwd=''
  3. for each in range(len(str1)):
  4.     if str1[each].islower():     #判断取出的是否为小写字母
  5.         position=each
  6.         front=position-3
  7.         rear=position+3
  8.         if str1[front:position].isupper() and str1[position+1:rear+1].isupper():         #判断前三位和后三位是否都为大写字母
  9.             if str1[front-1].isupper() == False and str1[rear+1].isupper() == False:         #判断前第4位和后第4位是否都不为大写字母
  10.                 passwd += str1[each]
  11. print(passwd)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-11 11:12:47 | 显示全部楼层
阿奇_o 发表于 2021-4-11 11:03
我理解应该是这样子,我就直接用正则表达式了,很方便:

我先存起来,等之后学到了再看,再次感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-11 11:13:22 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 11:20:52 | 显示全部楼层
  1. string = string.replace('\n','').replace('\r','')

  2. i = 3

  3. for each in string[3:-3]:
  4.     if each.islower() and string[i-3:i].isupper() and string[i+1:i+4].isupper():
  5.         if string[i-4].islower() and string[i+4].islower():
  6.             print(each,end = '')
  7.     i += 1

复制代码

我翻了下以前的代码,你参考一下有什么不同吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-11 11:23:29 | 显示全部楼层

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[front:position-1].isupper() and str1[position+1:rear].isupper():
            if str1[front-1].isupper() == False and str1[rear+1].isupper() == False:
                passwd += each
print(passwd)
请问为什么不能直接取出each呢,为了避免重复在index里限定了起始值为i-1,用来把范围缩小,但是最终输出结果不是ilovefishc,而是aqorjisoalbkcthzoivhqemmfbtenifdwizodtzvhyasoxrazvhdclchyqurnenccoau
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-11 11:31:08 | 显示全部楼层    本楼为最佳答案   
白本羽 发表于 2021-4-11 11:23
str1 = str1.replace('\n','').replace('\r','')
passwd=''
i=0

当然能用了
  1. str1 = str1.replace('\n','').replace('\r','')
  2. passwd=''
  3. i=0
  4. for each in str1:
  5.     i += 1
  6.     if each.islower():
  7.         position=str1.index(each,i-1)
  8.         front=position-3
  9.         rear=position+3
  10.         if str1[front:position].isupper() and str1[position+1:rear+1].isupper():
  11.             if str1[front-1].isupper() == False and str1[rear+1].isupper() == False:
  12.                 passwd += each
  13. print(passwd)
复制代码


你问题出在对str1的切片处理上,你看看我切的是啥,你切的是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-7 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表