鱼C论坛

 找回密码
 立即注册
查看: 3422|回复: 15

[已解决]求助14讲课后作业,为啥自己写的这一行一选就报错。。还有就是这一行为啥用三引号?

[复制链接]
发表于 2021-5-21 20:00:55 | 显示全部楼层 |阅读模式
7鱼币
  1. print ('请输入需要检查的密码组合:',end='')
  2. password = input()
  3. symbol1 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
  4. symbol2 = '0123456789'
  5. symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\'''#这一行自己写的,选择这一行就报错
  6. #symbol3 = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''#选择这一行不会报错

  7. time1 = 0#这里报错,syntaxerror  invaild syntax
  8. time2 = 0
  9. time3 = 0
  10. number = 0

  11. if len(password) ==0 or password.isspace():
  12.     print ('您未输入密码或者全是空格,请重新输入:',end='')
  13.     password = input()

  14. while 1:
  15.     for each in password:
  16.         number +=1
  17.         if time1 == 0:
  18.             if each in symbol1:
  19.                 time1 +=1
  20.         if time2 == 0:
  21.             if each in symbol2:
  22.                 time2 +=1
  23.         if time3 == 0:
  24.             if each in symbol3:
  25.                 time3 +=1
  26.         if each not in symbol1 and each not in symbol2 and each not in symbol3:
  27.             print ('密码中还有偏僻字符,请重新输入:',end='')
  28.             password =input()
  29.             break
  30.     if number == len(password):
  31.         break
  32. length = len(password)
  33. piece = password[:1]

  34. if length <= 8:
  35.     temp = 1
  36. elif length >= 16:
  37.     temp = 3
  38. else :
  39.     temp = 2

  40. print('您输入的密码等级:',end='')
  41. if temp ==3 and piece.isalpha() and time1 ==1 and time2 ==1 and time3 ==1:
  42.     print('高')
  43. elif time1 ==1 and time2 ==1 and time3 ==1:
  44.     print('中')
  45. elif temp ==2 and (time1+time2+time3 ==2):
  46.     print('中')
  47. elif (time1+time2+time3 ==2):
  48.     print('低')
  49. else:
  50.     print('低')
  51. print ('请按以下方式提升您的密码安全等级:')
  52. print ('\t1.密码必须有数字、字母及特殊字符组成\n\t2.密码只能由字母开头\n\t3.密码长度不能低于16位')

复制代码
最佳答案
2021-5-21 20:00:56

因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个而报错

你的代码最后多加个 \ 即可,参考代码:

  1. symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\\'''
复制代码


使用三引号是因为字符串中需要有 单引号或者 双引号,否则 Python 会将字符串字符中的引号当成结束的右引号



最佳答案

查看完整内容

因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个而报错 你的代码最后多加个 \ 即可,参考代码: 使用三引号是因为字符串中需要有 单引号或者 双引号,否则 Python 会将字符串字符中的引号当成结束的右引号
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:00:56 | 显示全部楼层    本楼为最佳答案   

因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个而报错

你的代码最后多加个 \ 即可,参考代码:

  1. symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\\'''
复制代码


使用三引号是因为字符串中需要有 单引号或者 双引号,否则 Python 会将字符串字符中的引号当成结束的右引号



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:02:32 | 显示全部楼层
感觉注释那一行和自己写的也没哪不一样。。不知道为啥报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:03:47 | 显示全部楼层
  1. symbol3 = r'''~!@#$%^&*()_=-/,.?<>;:[]{}|\'''
复制代码

最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:11:35 | 显示全部楼层
suchocolate 发表于 2021-5-21 20:03
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

前面不是有个r吗?这里三引号不是多行的意思吧,我改成单引号报错EOL while scanning string literal,改成双引号invaild syntax
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:14:50 | 显示全部楼层
suchocolate 发表于 2021-5-21 20:03
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

第五行代码最后的\挪到中间就没报错了,没懂为啥?不是说文本符前面r或者R可以使得\失去转义的作用吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:16:05 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:14
因为你自己些的将 \ 转义符放在了最后一个字符中,导致字符串的 ' 一个单引号被转义,导致右引号少了一个 ...

但是三引号里面包括的没有单引号或者双引号的嘛。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:16:43 | 显示全部楼层
杨东明 发表于 2021-5-21 20:14
第五行代码最后的\挪到中间就没报错了,没懂为啥?不是说文本符前面r或者R可以使得\失去转义的作用吗?


这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

若你将 \ 放在最后,就会导致生成字符串失败而报错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:18:31 | 显示全部楼层
杨东明 发表于 2021-5-21 20:16
但是三引号里面包括的没有单引号或者双引号的嘛。。


三个连续引号在一起就相当于属于一种组合,不会再次导致和单引号产生歧义
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:21:13 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:16
这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

若你将 \ 放在最后,就会 ...

这个没太懂。。意思是先转义符\必须正常发挥作用是吗?然后再由r转义,放在最后的\,没办法发挥正常作用,所以报错?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:23:09 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:16
这和数据生成顺序有关,因为 r'123456' 是先生成 '123456' 在进行 r 转义

若你将 \ 放在最后,就会 ...

r'123\t456'先生成'123    456',再生成'123456'?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-21 20:26:36 | 显示全部楼层
杨东明 发表于 2021-5-21 20:23
r'123\t456'先生成'123    456',再生成'123456'?


刚刚错了,是先 '123    456' 再r 后得到 '123\t456'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:28:21 | 显示全部楼层
Twilight6 发表于 2021-5-21 20:26
刚刚错了,是先 '123    456' 再r 后得到 '123\t456'

懂了,谢谢谢谢

点评

不客气~  发表于 2021-5-21 20:51
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-21 20:30:10 | 显示全部楼层
suchocolate 发表于 2021-5-21 20:03
最后面的\把'给转义了,长字符串不完整了。6个单引号或双引号包裹的字符串可以多行。

谢谢解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 13:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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