「Python」数据清洗常用正则

爬虫从网站上爬取的内容在读写操作时经常会报以下错误:
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\u200b’ in position 7: illegal multibyte sequence
所以需要我们对数据Unicode进行清洗,排除文章内异常的Unicode符号。

清洗思路

我的思路是用正则表达式来匹配常用字,不在范围内的Unicode编码则去除。
.compile(u”[^常用字范围]+”)匹配到非范围内字符后,
.sub()方法将特殊字符替换成空

def illegal_char(s):
    s = re \
        .compile( \
        u"[^"
        u"\u4e00-\u9fa5"
        u"\u0041-\u005A"
        u"\u0061-\u007A"
        u"\u0030-\u0039"
        u"\u3002\uFF1F\uFF01\uFF0C\u3001\uFF1B\uFF1A\u300C\u300D\u300E\u300F\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\u3010\u3011\u2014\u2026\u2013\uFF0E\u300A\u300B\u3008\u3009"
        u"\!\@\#\$\%\^\&\*\(\)\-\=\[\]\{\}\\\|\;\'\:\"\,\.\/\<\>\?\/\*\+"
        u"]+") \
        .sub('', s)
    return s

Unicode范围

常用范围

名称范围
中文\u4e00-\u9fa5
日文平假名\u3040-\u309f
日文片假名\u30a0-\u30ff
韩文\uac00-\ud7ff
英文字母\u0041-\u005A\u0061\u007A
数字\u0030-\u0039
英文标点!\@#$\%\^\&*()-\=[]{}\\;\’:\”,.\/\<>\?\/*+
中文标点使用下面的中文标点挨个匹配

注:网上有种方法写的中文标点匹配是 \u3000-\u303f\ufb00-\ufffd,但\u301c\ufffd在GBK中没有对应字符,仍然会报错,建议将中文标点挨个匹配

中文标点对应

名称Unicode符号
句号\u3002
问号\uFF1F
叹号\uFF01
逗号\uFF0C
顿号\u3001
分号\uFF1B
冒号\uFF1A
引号\u300C
\u300D
\u300E
\u300F
\u2018
\u2019
\u201C
\u201D
括号\uFF08
\uFF09
\u3014
\u3015
\u3010
\u3011
破折号\u2014——
省略号\u2026……
连接号\u2013
间隔号\uFF0E
书名号\u300A
\u300B
\u3008
\u3009

非英文语系字符范围

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

使用样例

import re

str1 = '33?3-3aa.,a中*文,a——a。a_+】!@@#$%^&*()(_++-[]{}\|";/<>.'

print(re.compile(u"[^\u4e00-\u9fa5]+").sub('', str1))  # 中文
print(re.compile(u"[^\u0041-\u005A|\u0061\u007A]+").sub('', str1))  # 英文
print(re.compile(u"[^\u0030-\u0039]+").sub('', str1))  # 数字
print(re.compile(u"[^\u3002|\uFF1F|\uFF01|\uFF0C|\u3001|\uFF1B|\uFF1A|\u300C|\u300D|\u300E|\u300F|\u2018|\u2019|\u201C|\u201D|\uFF08|\uFF09|\u3014|\u3015|\u3010|\u3011|\u2014|\u2026|\u2013|\uFF0E|\u300A|\u300B|\u3008|\u3009]+").sub('', str1))  # 中文标点
print(re.compile(u"[^\!\@\#\$\%\^\&\*\(\)\-\=\[\]\{\}\\\|\;\'\:\"\,\.\/\<\>\?\/\*\+]+").sub('',str1))  # 英文标点

输出结果

中文
aaaaaa
3333
,。】
,——。】
?-.*,+!@@#$%^&*()(++-[]{}\|";/<>.
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值