之前發過一篇關於定位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