1. 程式人生 > >「Python」資料清洗常用正則

「Python」資料清洗常用正則

對爬蟲資料進行自然語言清洗時用到的一些正則表示式

標籤中的所有屬性匹配(排除src,href等指定引數)

參考連結

# \b(?!src|href)\w+=[\'\"].*?[\'\"](?=[\s\>])
# 匹配特徵 id="..." 
# \b(?!...)排除屬性名中的指定引數,零寬斷言前向界定判斷屬性結束
# tips: 帶\b的python正則匹配一定要加r轉義

str1 = '''
<div class="concent" id="zoomcon" style="padding:15px;">
<img border="0" src="/xcsglj/zyhd/201802/f5492c1752094f44bcebae4a68480c64/images/9a900610afc54ee3b468780785a2ecec.gif"
>
<img border="0" src="/xcsglj/zyhd/201802/f5492c1752094f44bcebae4a68480c64/images/4b802f5d2d8c4ecd9a0525e0da7d886e.gif"> <img href="0" src="/xcsglj/zyhd/201802/f5492c1752094f44bcebae4a68480c64/images/4b802f5d2d8c4ecd9a0525e0da7d886e.gif"> ''' print(re.findall(r'\b(?!src)\w+=[\'\"].*?[\'\"](?=[\s\>])', string=str1)) # result: ['class="concent"', 'id="zoomcon"', 'style="padding:15px;"', 'border="0"', 'border="0"', 'href="0"']

html標籤的所有引數

# (?<=\<\w{1}\s).*?(?=\>)
# (?<=\<\w{2}\s).*?(?=\>)
# ...
# 清除n個字母的標籤的所有引數
# tips: 零寬斷言不支援不定長度的匹配

str1 = '''
<a class="1" id="1" style="padding:1;">
<td class="2" id="2" style="padding:2;">
<div class="3" id="3" style="padding:3;">
<span class
="4" id="4" style="padding:4;"> <table class="5" id="5" style="padding:5;"> ''' print(re.findall('(?<=\<\w{1}\s).*?(?=\>)', string=str1)) # result: ['class="1" id="1" style="padding:1;"'] print(re.findall('(?<=\<\w{2}\s).*?(?=\>)', string=str1)) # result: ['class="2" id="2" style="padding:2;"'] print(re.findall('(?<=\<\w{3}\s).*?(?=\>)', string=str1)) # result: ['class="3" id="3" style="padding:3;"'] print(re.findall('(?<=\<\w{4}\s).*?(?=\>)', string=str1)) # result: ['class="4" id="4" style="padding:4;"'] print(re.findall('(?<=\<\w{5}\s).*?(?=\>)', string=str1)) # result: ['class="5" id="5" style="padding:5;"']

非中文字元

# u'[^\u4e00-\u9fa5]+'
# 清除非中文字元

str1 = 'aa.,a中文,aa。a'

print(re.compile(u"[^\u4e00-\u9fa5]+").sub('', str1))
# result: 中文

指定萬用字元中的內容

# \{.*?\} // 匹配{}中的內容
# \<.*?\> // 匹配<>中的內容

str1 = '{萬用字元}你好,今天開學了{萬用字元},你好'
print(re.compile(r'\{.*?\}').sub('', str1))
# result: 你好,今天開學了,你好

html標籤尾部的空格

# \s*(?=\>)

指定標籤(包括中間的內容)

# \<style.*?/style\>

清除常用中英文字元/標點/數字外的特殊符號

# u'[^\u4e00-\u9fa5\u0041-\u005A\u0061-\u007A\u0030-\u0039\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\!\@\#\$\%\^\&\*\(\)\-\=\[\]\{\}\\\|\;\'\:\"\,\.\/\<\>\?\/\*\+\_"\u0020]+'

str1 = 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 "\u0020"
        u "]+")\
    .sub('', str1)