作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] 正规表达式可以用中文字吗?
时间Mon Dec 21 13:24:15 2015
※ 引述《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://webptt.com/cn.aspx?n=bbs/Python/M.1450675458.A.322.html
1F:推 alibuda174: 推 12/21 15:59
2F:→ cobrasgo: 哇塞玩这麽深啊…强 12/22 00:02
3F:推 hsnusonic: 好强~感谢分享 12/22 00:25
4F:推 banyhong: 好清楚的说明 12/22 16:15