Python核心程式設計 第三版 的一些小issue
阿新 • • 發佈:2022-04-13
第一章正則表示式 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語法就無法正常顯示