鱼C论坛

 找回密码
 立即注册
查看: 1076|回复: 20

[已解决]关于正则表达式和以变量来命名文件的问题

[复制链接]
发表于 2018-9-23 13:14:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 C.Icarus 于 2018-9-23 16:55 编辑

问题2的解决办法已找到,总结一下,当作自己的笔记,也给新手们参考参考:
字符串的末尾,即使是原始(raw)字符串末尾也不能带奇数个反斜杠,因为这会引起后续引号的转义!
比如r'C:\Windows\'这个字符串常量,后一个反斜杠会告诉解析器后面的单引号不是字符串的结尾,字符串由两个引号包围,少了一个引号结束字符串,所以出现"SyntaxError: EOL while scanning single-quoted string "这个错误;这说明原始字符串也不是100%的"raw",它影响字符串的开头和结尾,下面举几个例子:
r'C:\Windows'new'不是有效的字符串,前部分r'C:\Windows'已经是合法的字符串了,后面加上new'解析失败;
r'C:\Windows'\new'也会出错,错误原因同上,合法字符串r'C:\Windows'加上\new'让解析器解析失败;
r'C:\Windows\'new'不会出错,很多人理解的原始字符串会保留字符本来的意义,所以会认为字符串中 r'C:\Windows\'已经是一个合法的字符串了,后面还跟着new'使得字符串不合法,其实这个字符串中 r'C:\Windows\'不合法,应为后面的反斜杠告诉解析器"我后面的引号的意义已经被我转义了,在这里不是字符串的结尾,你可以继续进行解析"。

给字符串末尾加反斜杠的三种方法:
  1. with open(r'E:\PYTHON\必应每日壁纸'+'\\'+imgTitle+'.jpg','wb') as jpg:
复制代码
  1. with open('E:\\PYTHON\\必应每日壁纸\\'+imgTitle+'.jpg','wb') as jpg:
复制代码
  1. with open(r'E:\PYTHON\必应每日壁纸\\'[:-1]+imgTitle+'.jpg','wb') as jpg:
复制代码


以下为原帖:
1、已知:
  1. retJson = {"images":[{"startdate":"20180922","fullstartdate":"201809221600","enddate":"20180923","url":"/az/hprichbg/rb/ShenandoahAutumn_ZH-CN12756614363_1920x1080.jpg","urlbase":"/az/hprichbg/rb/ShenandoahAutumn_ZH-CN12756614363","copyright":"位于蓝岭山脉的雪兰多国家公园,美国弗吉尼亚州 (©
  2. Rachid Dahnoun/Tandem Stills + Motion)","copyrightlink":"/search?q=%e9%9b%aa%e5%85%b0%e5%a4%9a%e5%9b%bd%e5%ae%b6%e5%85%ac%e5%9b%ad&form=hpcapt&mkt=zh-cn","title":"","quiz":"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180922_ShenandoahAutumn%22&FORM=HPQUIZ","wp":true,"hsh":"a81a6f5084390e53d50922730729d8bd","drk":1,"top":1,"bot":1,"hs":[]}],"tooltips":{"loading":"正在加载...","previous":"上一个图像","next":"下一个图像","walle":"此图片不能下载用作壁纸。","walls":"下载今日美图。仅限用作桌面壁纸。"}}

  3. imgAddress = re.findall(?????????????????????)
复制代码


用re.findall怎么找出retJson中的'/az/hprichbg/rb/ShenandoahAutumn_ZH-CN12756614363_1920x1080.jpg'?

2、已知:
  1. imgTitle = '['+listDateNow[0]+']'  #已获取到今日日期,形如[2018-09-23]

  2. with open(r'E:\PYTHON\必应每日壁纸\'+imgTitle+'.jpg','wb') as jpg:  
  3.     jpg.write(image)
复制代码


将图片保存到E:\PYTHON\必应每日壁纸\[2018-09-23].jpg,为啥不行,求改正。

谢谢大佬解答!
最佳答案
2018-9-23 14:35:35
我蠢了,你开头路径就不能以反斜杠结尾,给忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-23 13:21:20 | 显示全部楼层
1,json是字典格式用键值
  1. retJson['images'][3]['url']
复制代码

2你的image得确定是jpg格式的2进制文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 13:31:32 | 显示全部楼层
本帖最后由 C.Icarus 于 2018-9-23 13:36 编辑
塔利班 发表于 2018-9-23 13:21
1,json是字典格式用键值

2你的image得确定是jpg格式的2进制文件


1、
  1. imgEndAddress = retDict['images'][0]['url']  
  2. imgAddress = 'https://cn.bing.com/'+imgEndAddress
复制代码

我忘说了,前面retJson是一个json字符串,不是字典
我已用字典方式解决了,但我想用正则表达式来实现
  1. imgAddress = re.findall(,"url":"(.*?)","urlbase":"/,retJson)
复制代码

怎么改?

2、
  1. img = requests.get(imgAddress)
  2. image = img.content
复制代码

image是二进制没问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 13:34:19 | 显示全部楼层
1,你得把retJson变成字符串,用str(retJson)试试
2.你报错信息是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 13:48:03 | 显示全部楼层
本帖最后由 C.Icarus 于 2018-9-23 13:50 编辑
塔利班 发表于 2018-9-23 13:34
1,你得把retJson变成字符串,用str(retJson)试试
2.你报错信息是啥


我干脆全部发出来吧:
  1. import requests
  2. import json
  3. import re
  4. from datetime import datetime

  5. url = 'https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1537625427283&pid=hp'
  6. headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"}

  7. ret = requests.get(url,headers=headers)

  8. retJson = ret.text
  9. retDict = json.loads(retJson)

  10. #获取当前日期并将其作为图片标题:
  11. dateNow = datetime.now()
  12. strDateNow = str(datetime.now())
  13. listDateNow = strDateNow.split(' ')
  14. imgTitle = '['+listDateNow[0]+']'

  15. # 方法一:通过字典索引获取图片后半段地址
  16. #imgEndAddress = retDict['images'][0]['url']

  17. #方法二:通过正则表达式获取img后半段地址
  18. imgEndAddress = re.findall(r''url': '(.*?)', 'urlbase': '/az'',retJson)

  19. imgAddress = 'https://cn.bing.com/'+imgEndAddress  # 图片完整地址

  20. img = requests.get(imgAddress)
  21. image = img.content

  22. with open(r'E:\PYTHON\必应每日壁纸\'+imgTitle+'.jpg','wb') as jpg:  
  23.     jpg.write(image)
复制代码

报错:
  1. File "e:\PYTHON\shiyan.py", line 31
  2.     with open(r'E:\PYTHON\必应每日壁纸\'+imgTitle+'.jpg','wb') as jpg:
  3.                                                    ^
  4. SyntaxError: invalid syntax
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 13:53:24 | 显示全部楼层
你把你的imgTitle去掉[]试下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 14:02:33 | 显示全部楼层
塔利班 发表于 2018-9-23 13:53
你把你的imgTitle去掉[]试下

去掉[]没用,如改为这种是可行的:
  1. with open(r'E:\PYTHON\必应每日壁纸\[a].jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 14:04:48 | 显示全部楼层
..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-23 14:11:45 | 显示全部楼层
你贴下报错截图,提示错误在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 14:17:30 | 显示全部楼层
塔利班 发表于 2018-9-23 14:11
你贴下报错截图,提示错误在哪里

截图不全,前面还有很多提示,看不到,不知是不是有关系:
  1. Microsoft Windows [版本 6.1.7601]
  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

  3. E:\PYTHON>cd e:\PYTHON && cmd /C "set "PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && set "PYTHONPATH=c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd" && d:\Anaconda3\python.exe -m ptvsd --host localhost --port 50104 e:\PYTHON\tiaoshi.py "
  4. Traceback (most recent call last):
  5.   File "d:\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main
  6.     "__main__", mod_spec)
  7.   File "d:\Anaconda3\lib\runpy.py", line 85, in _run_code
  8.     exec(code, run_globals)
  9.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\__main__.py", line 211, in <module>
  10.     singlesession=args.single_session)
  11.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\__main__.py", line 205, in main
  12.     debug_main(addr, name, kind, *extra, **kwargs)
  13.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_local.py", line 30, in debug_main
  14.     run_file(address, name, *extra, **kwargs)
  15.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_local.py", line 64, in run_file
  16.     run(argv, addr, **kwargs)
  17.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_local.py", line 125, in _run
  18.     _pydevd.main()
  19.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1743, in main
  20.     debugger.connect(host, port)
  21.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1099, in run
  22.     return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
  23.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1106, in _exec
  24.     pydev_imports.execfile(file, globals, locals)  # execute the script
  25.   File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.8.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\_pydev_imps\_pydev_execfile.py", line 25, in execfile
  26.     exec(compile(contents+"\n", file, 'exec'), glob, loc)
  27.   File "e:\PYTHON\tiaoshi.py", line 31
  28.     with open(r'E:\PYTHON\必应每日壁纸\'+imgTitle+'.jpg','wb') as jpg:
  29.                                                    ^
  30. SyntaxError: invalid syntax

  31. E:\PYTHON>
复制代码
sp180923_141520.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 14:19:40 | 显示全部楼层
'.jpg'前加r试试报错么,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 14:30:52 | 显示全部楼层
塔利班 发表于 2018-9-23 14:19
'.jpg'前加r试试报错么,,

还是一样

还是一样

还是一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 14:32:10 | 显示全部楼层
我在我电脑上试加[]什么的都没问题,你把路径反斜杠换成斜杠再试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 14:35:35 | 显示全部楼层    本楼为最佳答案   
我蠢了,你开头路径就不能以反斜杠结尾,给忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 14:52:00 | 显示全部楼层
塔利班 发表于 2018-9-23 14:32
我在我电脑上试加[]什么的都没问题,你把路径反斜杠换成斜杠再试试

换成反斜杠还是不行。

成功:
  1. with open('E:\\PYTHON\\必应每日壁纸\\'+imgTitle+'.jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码


成功:
  1. with open(imgTitle+'.jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码


失败:
  1. with open(r'E:\PYTHON\必应每日壁纸\'+imgTitle+'.jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-23 14:54:15 | 显示全部楼层

你imgTitle前面那个反斜杠给去掉,加上一个os.sep
或者打两个反斜杠
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 14:59:44 | 显示全部楼层
塔利班 发表于 2018-9-23 14:35
我蠢了,你开头路径就不能以反斜杠结尾,给忘了

我感觉不是这个问题啊,存到E:\PYTHON\文件夹了
sp180923_145809.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 15:04:21 | 显示全部楼层
RIXO 发表于 2018-9-23 14:54
你imgTitle前面那个反斜杠给去掉,加上一个os.sep
或者打两个反斜杠

双反斜杠是可行的,但os.sep不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 15:09:40 | 显示全部楼层
本帖最后由 C.Icarus 于 2018-9-23 15:11 编辑
塔利班 发表于 2018-9-23 14:35
我蠢了,你开头路径就不能以反斜杠结尾,给忘了


我用这种方式实现了:
#将前面的imgTitle改一下:
  1. imgTitle = listDateNow[0]+']'

  2. with open(r'E:\PYTHON\必应每日壁纸\['+imgTitle+'.jpg','wb') as jpg:  
  3.     jpg.write(image)
复制代码

但这种表达方式看着很奇怪啊
sp180923_151119.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-23 15:21:08 | 显示全部楼层
本帖最后由 C.Icarus 于 2018-9-23 15:30 编辑
塔利班 发表于 2018-9-23 14:32
我在我电脑上试加[]什么的都没问题,你把路径反斜杠换成斜杠再试试


刚理解错你的意思了,将反斜杠换成斜杠是可行的:

成功:
  1. with open('E:/PYTHON/必应每日壁纸/'+imgTitle+'.jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码


成功:
  1. with open('E:\\PYTHON\\必应每日壁纸\\'+imgTitle+'.jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码


失败:
  1. with open(r'E:\PYTHON\必应每日壁纸\'+imgTitle+'.jpg','wb') as jpg:  
  2.     jpg.write(image)
复制代码

但其中原因是为什么???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 03:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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