正則表達式的分組及在pandas中的實用操作
之前的博客中已經講解了相關的正則表達式的一些基礎的內容,可見:正則1,正則2,正則3,正則4這裏補充一下正則表達式分組的相關內容以及結合pandas使用時候的實際操作
1. 正則表達式分組
1.1 分組的模式
字符 | 功能 |
---|---|
(ab) | 將括號中的字符作爲一個分組 |
\num | 引用分組的num匹配到的字符串 |
(?P<name>) | 分組起名 |
(?P=name) | 引用別名爲name分組匹配到的字符串 |
1.2 分組的實際操作
1.2.1 郵箱號碼匹配
舉個簡單的應用就是匹配郵箱地址,由於存在不同類型的郵箱,這裏只列舉163,126和qq郵箱,執行操作如下
發現匹配的結果並不是我們希望得到的那樣,因此這裏就要用到分組匹配的方式,也就是將存在多種可能性結果匹配的方式進行分組,具體操作如下
1.2.2 標籤信息匹配
1) 數字分組命名
比如在爬蟲過程中,有時候想偷懶不想分析網頁的結構,這時候就可以直接使用正則表達式匹配標籤,從而獲得想要的內容,簡單的舉例如下
- 其中group()默認返回的滿足匹配要求的字符串
- 分組後,如果要提取每個分組中的內容,可以按照默認的順序進行數據的提取,從數字0開始
- 其中0代表匹配成功的全部的字符串的內容(等同於直接直接group(),也就是說0可以不寫),之後1,2,3就是按照括號分組出現的次序,進行依次提取數據
2) 自定義分組命名
當要匹配或者分組的類容較多時候,如果再使用數字命名的方式,提取數據的時候就會顯得很不方便(pandas中爲了方便創建滿足的字段),因此就有了自定義分組命名的需求,爲了方便查看,沒有直接截圖,這裏將運行結果複製粘貼到代碼區
In [16]: re.search(r'<(?P<wangye>\w+)><(?P<biaoti>\w+)>(?P<neirong>.*)</(?P=biaoti)></(?P=wangye)>',html).group('wangye')
Out[16]: 'html'
In [17]: re.search(r'<(?P<wangye>\w+)><(?P<biaoti>\w+)>(?P<neirong>.*)</(?P=biaoti)></(?P=wangye)>',html).group('biaoti')
Out[17]: 'h1'
In [18]: re.search(r'<(?P<wangye>\w+)><(?P<biaoti>\w+)>(?P<neirong>.*)</(?P=biaoti)></(?P=wangye)>',html).group('neirong')
Out[18]: 'title'
- 注意:在自定義分組命名的時候,匹配的正則表達式要在命名字符的後面,分組括號的前面,名稱可以自由選取
2. pandas中的應用操作
比如要分析房價的影響因素的時候,要從描述字段中提取房源所處的公交情況和具體的幾室幾廳時候,示例的文件數據內容如下
可以從數據中看出,這兩個字段都是有大量相同的字符數據,因此可以直接使用正則表達式分組進行符合要求的數據提取,並利用自定義分組命名的方式創建新列(新字段),操作如下
2.1 導入庫,讀取文件數據,並輸出指定的字段
import pandas as pd
data = pd.read_csv(r'C:\Users\86177\Desktop\租房信息.csv')
data = data[['戶型','公交站']]
data.head(10)
→ 輸出的結果爲:
2.2 提取數據,創建新字段
room_type = data['戶型'].str.extract('(?P<room>\d+)室(?P<hall>\d+)廳')
subway = data['公交站'].str.extract('距(?P<sub_line>\d+)號線(?P<sub_station>\w+)站約(?P<sub_dist>\d+)米。')
data = pd.concat([data, room_type, subway],axis = 1)
data.head(10)
→ 輸出的結果爲:(最終就直接多出來處理好的5個字段)
3. 小結
使用正則表達式分組的方式除了在爬蟲中提取指定格式下的滿足數據外,也可以使用在pandas中用於數據處理(提取滿足數據並創建新列)
博客中使用的租房信息.csv文件已經上傳至資源