正则表达式匹配中文时发现的问题

大家使用正则表达式匹配中文时,常用 [\u4e00-\u9fa5] ,但有时使用 [\u4e00-\u9fa5] 匹配汉字时,发现有的汉字匹配不到,如:

㸌如
㔩叶

使用Python3测试:

r = '[^\u4e00-\u9fa5]'					#非汉字
for i in words:
	word = re.sub(r, '', i)				#替换掉非汉字
	if len(word) == 1:					
		print('"{0}"变成了"{1}"'.format(i, word))

结果为:

"㸌如"变成了"如"
"㔩叶"变成了"叶"

这是为什么呢?下面是几个主要的非英文语系字符范围:

2E80~33FFh:中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符,中日韩的符号、标点、带圈或带括符文数字、月份,以及日本的假名组合、单位、年号、月份、日期、时间等。
3400~4DFFh:中日韩认同表意文字扩充A区,总计收容6,582个中日韩汉字。
4E00~9FFFh:中日韩认同表意文字区,总计收容20,902个中日韩汉字。
A000~A4FFh:彝族文字区,收容中国南方彝族文字和字根。
AC00~D7FFh:韩文拼音组合字区,收容以韩文音符拼成的文字。
F900~FAFFh:中日韩兼容表意文字区,总计收容302个中日韩汉字。
FB00~FFFDh:文字表现形式区,收容组合拉丁文字、希伯来文、阿拉伯文、中日韩直式标点、小符号、半角符号、全角符号等。

如果将字符范围扩大为 \u4e00-\u9fff 会如何呢?

r = '[^\u4e00-\u9fff]'					
for i in words:
	word = re.sub(r, '', i)				
	if len(word) == 1:					
		print('"{0}"变成了"{1}"'.format(i, word))

结果还是:

"㸌如"变成了"如"
"㔩叶"变成了"叶"

继续扩大字符范围为 \u3400-\u9fa5:

r = '[^\u3400-\u9fa5]'					
for i in words:
	word = re.sub(r, '', i)				
	if len(word) == 1:					
		print('"{0}"变成了"{1}"'.format(i, word))

这次终于匹配到了,结果为:

"㸌如"变成了"㸌如"
"㔩叶"变成了"㔩叶"

这说明 “㸌” 和 “㔩” 两个字不在 4E00~9FFFh 范围内,而在 3400~4DFFh 范围中,所以,在使用 [\u4e00-\u9fa5] 匹配中文结果不正确时,可以扩大匹配范围尝试。

猜你喜欢

转载自blog.csdn.net/qq_38882327/article/details/89669956