鱼C论坛

 找回密码
 立即注册
查看: 2455|回复: 1

[已解决]Python 的正则~

[复制链接]
发表于 2016-7-12 10:59:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 SixPy 于 2016-7-12 11:36 编辑

Python 的正则有Bug!

有人问了个正则替换的问题:

如何正则表达式的sub替换这个字符
http://bbs.fishc.com/thread-73698-1-1.html
(出处: 鱼C论坛)

我想用预查的方法定位到 类似‘2016-07-07’中的 “-”。

  1. import re

  2. exa = 'http://www.listeningexpress.com/voa/news/2016/07/voanews-2016-07-07-Top-5-Songs-for-Week-Ending-July-9.mp3'
  3. rpl='%'

  4. ptnA=re.compile(r'(?<=\d{2})-(?=\d{2})') # "-" 两边同时 是 2位数字
  5. A=re.sub(ptnA,rpl,exa)
  6. print('A\n',A,'\n')

  7. ptnB=re.compile(r'(?<!\d{2})-(?!\d{2})') # "-" 两边同时 不是 2位数字
  8. B=re.sub(ptnB,rpl,exa)
  9. print('B\n',B)
复制代码


执行结果:
A
http://www.listeningexpress.com/voa/news/2016/07/voanews-2016%07%07-Top-5-Songs-for-Week-Ending-July-9.mp3

B
http://www.listeningexpress.com/voa/news/2016/07/voanews-2016-07-07-Top%5%Songs%for%Week%Ending%July%9.mp3

--------

第一种,执行正确了。
显然,第二种情况是错误的结果。
标红的 "-" 应该是 符合预设条件 ptnB,但依然没有被替换为 % 。
最佳答案
2016-7-12 11:34:33
呃~~~

仔细想了一下,是我自己理解有误了。
正确的写法应该是:
  1. import re

  2. exa = 'http://www.listeningexpress.com/voa/news/2016/07/voanews-2016-07-07-Top-5-Songs-for-Week-Ending-July-9.mp3'
  3. rpl='%'

  4. ptnA=re.compile(r'(?<=\d{2})-(?=\d{2})') # "-" 两边同时 是 2位数字
  5. A=re.sub(ptnA,rpl,exa)
  6. print('A\n',A,'\n')

  7. ptnB=re.compile(r'(?:(?<!\d{2})-)|(?:-(?!\d{2}))') # "-" 前或后边 不是 2位数字
  8. B=re.sub(ptnB,rpl,exa)
  9. print('B\n',B)
复制代码

--------
结果:
  1. A
  2. http://www.listeningexpress.com/voa/news/2016/07/voanews-2016%07%07-Top-5-Songs-for-Week-Ending-July-9.mp3

  3. B
  4. http://www.listeningexpress.com/voa/news/2016/07/voanews%2016-07-07%Top%5%Songs%for%Week%Ending%July%9.mp3
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-12 11:34:33 | 显示全部楼层    本楼为最佳答案   
呃~~~

仔细想了一下,是我自己理解有误了。
正确的写法应该是:
  1. import re

  2. exa = 'http://www.listeningexpress.com/voa/news/2016/07/voanews-2016-07-07-Top-5-Songs-for-Week-Ending-July-9.mp3'
  3. rpl='%'

  4. ptnA=re.compile(r'(?<=\d{2})-(?=\d{2})') # "-" 两边同时 是 2位数字
  5. A=re.sub(ptnA,rpl,exa)
  6. print('A\n',A,'\n')

  7. ptnB=re.compile(r'(?:(?<!\d{2})-)|(?:-(?!\d{2}))') # "-" 前或后边 不是 2位数字
  8. B=re.sub(ptnB,rpl,exa)
  9. print('B\n',B)
复制代码

--------
结果:
  1. A
  2. http://www.listeningexpress.com/voa/news/2016/07/voanews-2016%07%07-Top-5-Songs-for-Week-Ending-July-9.mp3

  3. B
  4. http://www.listeningexpress.com/voa/news/2016/07/voanews%2016-07-07%Top%5%Songs%for%Week%Ending%July%9.mp3
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 17:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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