百木园-与人分享,
就是让自己快乐。

Python核心编程 第三版 的一些小issue

第一章正则表达式 1.3 1.3.12 使用sub()和subn()搜索与替换

在最后一段,文中提到:

“前面讲到,使用匹配对象的group()方法除了能够取出匹配分组编号外,还可以使用\\N,其中 N 是在替换字符串中使用的分组编号。下面的代码仅仅只是将美式的日期表示法MM/DD/YY{,YY}格式转换为其他国家常用的格式DD/MM/YY{,YY}。

>>> re.sub(r\'(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})\',
...   r\'\\2/\\1/\\3\', \'2/20/91\') # Yes, Python is...
\'20/2/91\'
>>> re.sub(r\'(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})\',
...   r\'\\2/\\1/\\3\', \'2/20/1991\') # ...20+ years old!
\'20/2/1991”

摘录来自
Python核心编程 第3版
[美]卫斯理 春(Wesley Chun)
此材料受版权保护。\"

我注意到,当按照书中格式尝试对日期的日,月,年进行识别并交换位置时,issue如下

>>> re.sub(r\'(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})\', r\'\\2/\\1/\\3\', \'2/20/1991\')
\'20/2/1991\'
>>> re.sub(r\'(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})\', r\'\\3/\\1/\\2\', \'4/13/2022\')
\'20/4/1322\'                          <--

明显\\3在对年份的识别有错,即如果写 (\\d{2}|\\d{4}) ,会从左到右匹配,这样一来2022只有20会被匹配到,导致出现\'20/4/1322\'的情况

在将(\\d{2}|\\d{4}) 的顺序调过来,变成(\\d{4}|\\d{2})之后,issue解决了,无论是两位数年份还是四位数的年份

>>> re.sub(r\'(\\d{1,2})/(\\d{1,2})/(\\d{4}|\\d{2})\', r\'\\3/\\1/\\2\', \'4/13/2022\')
\'2022/4/13\'
>>> re.sub(r\'(\\d{1,2})/(\\d{1,2})/(\\d{4}|\\d{2})\', r\'\\3/\\1/\\2\', \'4/13/22\')
\'22/4/13\'

PS:吐槽一句博客园的markdown似乎<br>不可以贴着下一行,否则下一行的md语法就无法正常显示


来源:https://www.cnblogs.com/wutongshu-ltz/p/16140995.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Python核心编程 第三版 的一些小issue

相关推荐

  • 暂无文章