【前言】在寫爬蟲時,正則表達式有時候比較難寫,一個是自己不熟練,二者數據分析提取數據千奇百怪。
一、好在python有個re模塊,提供了很多更加簡便的方法;可參考此文檔:https://www.cnblogs.com/tina-python/p/5508402.html
二、但有時候,不能實現過濾抽取的功能,python提供了filter函數。 可參考: http://www.runoob.com/python/python-func-filter.html
具體的應用:
1 crazystring = 'dade142.!0142f[., ]ad' 2 3 # 只保留數字,使用內置方法str.isdigit 4 new_crazy = filter(str.isdigit, crazystring) 5 print(''.join(list(new_crazy))) 6 # 只保留字母 7 new_crazy = filter(str.isalpha, crazystring) 8 print(''.join(list(new_crazy))) 9 10 11 # 只保留字母和數字 12 new_crazy = filter(str.isalnum, crazystring) 13 print(''.join(list(new_crazy))) 14 15 # 如果想保留數字0-9和小數點’.’ 則需要自定義函數 16 #下面使用lambda表達式,方便快捷 17 new_crazy = filter(lambda ch: ch in '0123456789.', crazystring) 18 print(''.join(list(new_crazy)))
其中的str.isdigit是其內置方法。
我們也可以自己定義規則,不如只過濾出奇數:
#!/usr/bin/python # -*- coding: UTF-8 -*- def is_odd(n): return n % 2 == 1 newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) print(newlist)
定義函數時,可以使用lambda表達式,這樣會更加方便。
三、我的具體應用場景
在寫爬蟲分析驗證碼時,用騰訊雲分析回的json文件,提取驗證碼時用到正則匹配。一直找python的正則表達式,不好找也不好寫。
1、對傳回的json數據,做一個正則提取:
r_index = r'itemstring":"(.*?)"'
2、然兒,提取的二維碼總會有噪聲,(.*?)是將所有數據都提取出來了。但是,我們深度學習識別出來的二維碼有噪聲,會有‘\'、‘_’、或者空格。需要二次處理。目標是提取數字和字母,不含有任何空格和噪聲。使用"\W+",會有下划線。我們使用:
#接在上面的語句后面,進一步過濾
new_index = filter(str.isalnum, r_index)
3、最終可以實現百分之九十准確率。當然離不開深度學習算法對數字識別率高。