Re: [問題] 正規表達式可以用中文字嗎?

看板Python作者 (←這人是超級笨蛋)時間10年前 (2015/12/21 13:24), 編輯推噓3(301)
留言4則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《aster30 (紫苑)》之銘言: : import re : str = '萬' : print re.search('[萬千百十]',str) : 執行結果:<_sre.SRE_Match object at 0x04BF83D8> : 這樣會match : str = '金' : print re.search('[萬千百十]',str) : 執行結果:None : str = '台' : print re.search('[萬千百十]',str) : 執行結果:<_sre.SRE_Match object at 0x04BF8480> : str = '台' : print re.search('[萬]',str) : 執行結果:None 因為你用 Python 2 的 str, 且檔案編碼應該是 UTF-8 :p Python 2 的 str 事實上是一個以位元組為單位的 sequence 所以當你寫 '台' 時, Python 內部看到的是(假設編碼 UTF-8)'\xe5\x8f\xb0' 這也是為什麼當你對它取長度時會看到奇怪的結果 print len('台') # 3 你列出這幾個字的編碼分別是 台 e5 8f b0 萬 e8 90 ac 千 e5 8d 83 百 e7 99 be 十 e5 8d 81 金 e9 87 91 可以看到「台」「千」「十」都有 e5 所以當你 re.search('[萬千百十]', '台') 時 Python 會找到 e5 這個位元組相符 match = re.search('[萬千百十]', '台') print match.group(0) # '\xe5' 讓 re 支援中文(或大多數用到複數位元組字的語言)的方法是改用 unicode type 這個 type 的單位是 Unicode codepoint 所以台就是台、萬就是萬、千就是千(一個字), 不會變成三個位元組 進而讓比對邏輯正確 在 Python 2 的解法就是改用 u'' literal 來寫你的字串 或者你可以直升 Python 3, 因為 str type 改成以 Unicode codepoint 為單位 就不會遇到這個 Guido 年輕犯下的錯誤 ;) -- 「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。 如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」 -- 班尼多‧加羅素,前義大利藍隊成員 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.94.57 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1450675458.A.322.html

12/21 15:59, , 1F
12/21 15:59, 1F

12/22 00:02, , 2F
哇塞玩這麼深啊…強
12/22 00:02, 2F

12/22 00:25, , 3F
好強~感謝分享
12/22 00:25, 3F

12/22 16:15, , 4F
好清楚的說明
12/22 16:15, 4F
文章代碼(AID): #1MTuq2CY (Python)
討論串 (同標題文章)
文章代碼(AID): #1MTuq2CY (Python)