正在编写的一个小程序MiniBlogs Updater中,需要计算用户所输入的文字字数。因为中英文字符编码长度不一,如果直接使用python中的len()函数,它计算的是该字串的实际长度,一个中文字并非等同于一个英文字母的。因此,需要把中文字当成英文字母来处理。
我写了这样一条语句来处理:
代码如下 | 复制代码 |
length=len(re.sub('[x80-xff]{3}','a',msg)) |
它的意思是,把所有的中文都替换成英文字母a,然后再统计字数。(只是统计而已,不修改源字串。)这条语句在windows下utf8文件中能够正常工作。
常见中文正则表达式匹配结果比较
模式[u4e00-u9fff]匹配结果为:2 mi ^ ^
模式[^u4e00-u9fff]匹配结果为:我亲爱的 只Mao ,你知道吗?我在想你们 -
模式[u4e00-u9fa5]匹配结果为:2 mi ^ ^
模式[^u4e00-u9fa5]匹配结果为:我亲爱的 只Mao ,你知道吗?我在想你们 –
模式[u4e00-u9fa5uf900-ufa2d]匹配结果为:2 mi ^ ^
模式[^u4e00-u9fa5uf900-ufa2d]匹配结果为:我亲爱的 只Mao ,你知道吗?我在想你们 -
模式[chr(0xa1)-chr(0xff)]匹配结果为:2 mi, ^-^
模式[^chr(0xa1)-chr(0xff)]匹配结果为:我亲爱的 只Mao 你知道吗?我在想你们
模式[x80-xff]匹配结果为:我亲爱的 只Mao 你知道吗?我在想你们
模式[^x80-xff]匹配结果为:2 mi, ^-^
模式[x00-xff]匹配结果为:我亲爱的2只Maomi,你知道吗?我在想你们^-^
模式[^x00-xff]匹配结果为:
模式[x80-xff][x80-xff]匹配结果为:我亲爱的 只Mao 你知道吗?我在想你们
模式[^x80-xff][^x80-xff]匹配结果为:mi, ^-^
网上关于GBK、GB2312和BIG5编码范围的资料比较多,但是日文的资料比较少,我总结了一下,希望能对大家在正则中判断
这些字符集尤其是日文字符集的各种字、标点以及特殊符号的时候有所帮助。
代码如下 | 复制代码 |
UTF8 [x01-x7f]|[xc0-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3} UTF16 JIS SJIS EUC_JP EUC_JP标点符号及特殊字符 EUC_JP全角数字 xa3[xb0-xb9] EUC_JP全角大写英文 xa3[xc1-xda] EUC_JP全角小写英文 EUC_JP全角平假名 xa4[xa1-xf3] EUC_JP全角片假名 xa3[xb0-xb9]|xa3[xc1-xda]|xa5[xa1-xf6][xa3][xb0-xfa]|[xa1][xbc-xbe]|[xa1][xdd] EUC_JP全角汉字 [xb0-xcf][xa0-xd3]|[xd0-xf4][xa0-xfe]|[xB0-xF3][xA1-xFE]|[xF4][xA1-xA6]|[xA4][xA1-xF3]|[xA5][xA1-xF6]|[xA1][xBC-xBE] Big5 [x01-x7f]|[x81-xfe]([x40-x7e]|[xa1-xfe]) GBK [x01-x7f]|[x81-xfe][x40-xfe] GB2312汉字 [xb0-xf7][xa0-xfe] GB2312半角标点符号及特殊符号 xa1[xa2-xfe] GB2312罗马数组及项目序号 xa2([xa1-xaa]|[xb1-xbf]|[xc0-xdf]|[xe0-xe2]|[xe5-xee]|[xf1-xfc]) GB2312全角标点及全角字母 xa3[xa1-xfe] GB2312日文平假名 xa4[xa1-xf3] GB2312日文片假名 xa5[xa1-xf6] ?充: GB18030 日文半角空格 x20 SJIS全角空格 SJIS全角数字 SJIS全角大写英文 SJIS全角小写英文 SJIS全角平假名 SJIS全角平假名扩展 (?:x82[x9f-xf1]|x81[x4ax4bx54x55]) SJIS全角片假名 SJIS全角片假名扩展 (?:x83[x40-x96]|x81[x45x5bx52x53]) EUC_JP全角空格 EUC半角片假名 |