Python正则拆分中文字符串时生僻字拆分不一致如何调整规则?
问题原因
你当前正则中使用的\u4E00-\u9FD5仅覆盖了CJK统一表意文字基本区的常用汉字,而“𩾃”属于CJK统一表意文字扩展B区,编码为U+29F83,不在你定义的字符范围内,因此正则会将其判定为非匹配字符,导致“𩾃鱼”被拆分为两段。
解决方案
方案1:使用Unicode字符属性匹配(推荐)
Python 3.11及以上版本的标准库re已经支持Unicode属性转义,你可以用\p{Unified_Ideograph}匹配所有中日韩统一表意汉字(包含所有扩展区的生僻字),修改后的正则如下:
import re re_default = re.compile(r"([\p{Unified_Ideograph}a-zA-Z0-9+#&._%\-]+)", re.U)
如果你的Python版本低于3.11,可以安装第三方regex库,其用法和标准re完全一致,同样支持\p语法,兼容性更好。
方案2:手动补全CJK汉字编码范围
如果不想额外安装依赖,也可以把所有CJK汉字的编码范围手动加到正则的字符组中,完整覆盖常用生僻字的编码范围如下:
- 基本区:
\u4E00-\u9FFF - 扩展A区:
\u3400-\u4DBF - 扩展B区:
\U00020000-\U0002A6DF - 扩展C区:
\U0002A700-\U0002B73F - 扩展D区:
\U0002B740-\U0002B81F - 扩展E区:
\U0002B820-\U0002CEAF - 扩展F区:
\U0002CEB0-\U0002EBEF
修改后的正则如下:
import re re_default = re.compile(r"([\u4E00-\u9FFF\u3400-\u4DBF\U00020000-\U0002A6DF\U0002A700-\U0002B73F\U0002B740-\U0002B81F\U0002B820-\U0002CEAF\U0002CEB0-\U0002EBEFa-zA-Z0-9+#&._%\-]+)", re.U)
修改完成后再次测试,“𩾃鱼”的拆分结果就会和“兰蔻”一致,输出为['', '𩾃鱼', '']。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

