1. 程式人生 > 其它 >Python核心程式設計 第三版 的一些小issue

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語法就無法正常顯示