之前发过一篇关于定位csv中的特殊字符的,主要是用到了python的自带的函数,近期又遇到了一些新的问题,比如isdigit()的缺点在于不能判断浮点型,以及小数中有多个小数点的情况。发现还是正则表达式更灵活一些。

import pandas as pd
import numpy as np
import csv
import re

def 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 = 0
for 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 False

if __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