|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 SixPy 于 2016-7-12 11:36 编辑
Python 的正则有Bug!
有人问了个正则替换的问题:
如何正则表达式的sub替换这个字符
http://bbs.fishc.com/thread-73698-1-1.html
(出处: 鱼C论坛)
我想用预查的方法定位到 类似‘2016-07-07’中的 “-”。
- import re
- exa = 'http://www.listeningexpress.com/voa/news/2016/07/voanews-2016-07-07-Top-5-Songs-for-Week-Ending-July-9.mp3'
- rpl='%'
- ptnA=re.compile(r'(?<=\d{2})-(?=\d{2})') # "-" 两边同时 是 2位数字
- A=re.sub(ptnA,rpl,exa)
- print('A\n',A,'\n')
- ptnB=re.compile(r'(?<!\d{2})-(?!\d{2})') # "-" 两边同时 不是 2位数字
- B=re.sub(ptnB,rpl,exa)
- 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,但依然没有被替换为 % 。
呃~~~
仔细想了一下,是我自己理解有误了。
正确的写法应该是:
- import re
- exa = 'http://www.listeningexpress.com/voa/news/2016/07/voanews-2016-07-07-Top-5-Songs-for-Week-Ending-July-9.mp3'
- rpl='%'
- ptnA=re.compile(r'(?<=\d{2})-(?=\d{2})') # "-" 两边同时 是 2位数字
- A=re.sub(ptnA,rpl,exa)
- print('A\n',A,'\n')
- ptnB=re.compile(r'(?:(?<!\d{2})-)|(?:-(?!\d{2}))') # "-" 前或后边 不是 2位数字
- B=re.sub(ptnB,rpl,exa)
- 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
复制代码
|
|