之前发过一篇关于定位csv中的特殊字符的,主要是用到了python的自带的函数,近期又遇到了一些新的问题,比如isdigit()的缺点在于不能判断浮点型,以及小数中有多个小数点的情况。发现还是正则表达式更灵活一些。
import pandas as pdimport numpy as npimport csvimport redef is_chinese(uchar): if u'\u4e00' <= uchar <= u'\u9fff': return True else: return False csv_reader = csv.reader(open('D:/测试-清洗后数据-utf8.csv', encoding = 'utf-8')) rows = 0for row in csv_reader: columns = 0 rows += 1 for Factor in row[0:]: columns += 1 if not Factor.isalnum() and Factor != '' and not is_chinese(Factor) and re.match("[0-9]+\.[0-9]+$",Factor) == None:# columns += 1 print(rows,columns,Factor)
更多的字符判断代码可以参考下面:
#!/usr/bin/env python# -*- coding:utf-8-*-# 判断一个unicode是否是汉字def is_chinese(uchar): if '\u4e00' <= uchar<='\u9fff': return True else: return False# 判断一个unicode是否是数字def is_number(uchar): if '\u0030' <= and uchar<='\u0039': return True else: return False# 判断一个unicode是否是英文字母def is_alphabet(uchar): if ('\u0041' <= uchar<='\u005a') or ('\u0061' <= uchar<='\u007a'): return True else: return False# 判断是否非汉字,数字和英文字符def is_other(uchar): if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)): return True else: return Falseif __name__=="__main__": ustring=u'中国 人名a高频A' # 判断是否有其他字符; for item in ustring: if (is_other(item)): break
关于正则表达式的解释:
^[-+]?[0-9]+\.[0-9]+$
^表示以这个字符开头,也就是以[-+]开头,[-+]表示字符-或者+之一,
?表示0个或1个,也就是说符号是可选的。
同理[0-9]表示0到9的一个数字,+表示1个或多个,也就是整数部分。
\.表示的是小数点,\是转义字符因为.是特殊符号(匹配任意单个除\r\n之外的字符),
所以需要转义。
小数部分同理,$表示字符串以此结尾。
最后,推荐一个好用的写正则的网站,用它检查正则表达式比较方便,https://regexper.com/#%5E(%5B%EF%BC%88(%5D%7C)%5B%200-9%E4%B8%80%E4%BA%8C%E4%B8%89%E5%9B%9B%E4%BA%94%E5%85%AD%E4%B8%83%E5%85%AB%E4%B9%9D%E5%8D%81%5D%2B%5B.%EF%BC%8E%E3%80%82%EF%BC%8C%E3%80%81%EF%BC%9A)%EF%BC%89%5D%2B%5B.0-9A-Z%5D%24