2. 正則表達式—提取字符串
標籤(空格分隔): 4.5python爬蟲
regular expression 正則表達
導入正則函數
import re
創建一個正則表達式
reg=re.compile(‘a.*b’)
str1=‘a123456b’
str2=‘123aaaa456bbbb789’
1. match—從頭開始匹配
result1=re.match(reg,str1)
result2=re.match(reg,str2)
print(result1) # 輸出的內容還是一個對象
print(result2) # 沒有內容
2. search—尋找,返回找到的結果
reg=re.compile(‘a.*b$’)
str1=‘a123456b’
str2=‘123aaaa456bbbb789’
result1=re.search(reg,str1)
result2=re.search(reg,str2) #有^ / $ 時 None
print(result1)
print(result2)
^ 查找以什麼爲開頭的
$ 查找以什麼爲結尾的
3. . (貪婪模式) 和 .*? (非貪婪模式)*
(1) 貪婪模式 .*
reg = re.compile(‘a.*b’) # 運行結果 [‘a123b456b789b’]
(2) 非貪婪模式 .*?
? 表示零個或者一個
reg = re.compile(‘a.*?b’) # 運行結果 [‘a123b’]
str3=‘a123b456b789b’
result3=re.findall(reg,str3)
print(result3)
4. () 內爲要提取的內容
reg1 = re.compile(’(.?b)’) # 提取b 之前的內容
reg2 = re.compile('a(.?)b’) # 提取ab之間的內容
str3=‘a123b456b789b’
result1=re.findall(reg1,str3)
result2=re.findall(reg2,str3)
print(result1)
print(result2)
5. sub 和 subn 替換
str5 = ‘a123’
print(str5.replace(‘a’,‘A’)) # A123
(1) re.sub
語法: re.sub (正則表達式,替換爲什麼,替換對象,替換次數(默認全部))
reg1 = re.compile(’[a-zA-Z]+’)
result5=re.sub(reg1,’,’,str5)
result5=re.sub(reg1,’,’,str5,2)
print(result5)
(2) re.subn
語法: re.subn (正則表達式,替換爲什麼,替換對象)
- re.subn 返回值是元組(替換後的字符串,替換的次數)
result6=re.subn(reg1,’,’,str5)
print(result6)
6. 提取中文 [\u4E00-\u9FA5]
reg = re.compile(’[\u4E00-\u9FA5]+’)
strang=‘張三:20,李四:22,王五:25’
result = re.findall(reg,strang)
print(result)
7. 正則表達式提取總結
總結:正則表達式
目的: 按照 指定的規則 從 字符串 中提取內容
指定的規則: 變量 reg = re.compile(‘字符串’,[匹配模式])
匹配模式: re.I 忽略大小寫 re.S 讓 . 可以匹配換行\n
字符串: 已有的str
提取內容:使用正則的方法
re.match(reg,str)
re.search(reg,str)
re.split(reg,str)
re.findall(reg,str) 返回list
re.sub(reg,str)
re.subn(reg,str)
8. 練習題
(1). 提取is|IS(不分大小寫)
import re
str6=‘He is a boy , his name IS Jack.’
reg2 = re.compile(‘is’,re.I) # 方法1
或reg2 = re.compile(‘is|IS’) # 方法2
result7=re.findall(reg2,str6)
print(result7)
問題: 輸出結果 [‘is’, ‘is’, ‘IS’] 但第二個is 是單詞his 的部分
- \b 單詞邊界. 想讓單詞邊界生效,要用r’\b’
str6=‘He is a boy , his name IS Jack.’
reg2 = re.compile(r’\bis\b’,re.I)
result7=re.findall(reg2,str6)
print(result7) # 運行結果 [‘is’, ‘IS’]
(2). 提取字符串導演/地區/時間
film = ‘’’
導演: 弗蘭克·德拉邦特 Frank Darabont 主演: 蒂姆·羅賓斯 Tim Robbins /…
1994 / 美國 / 犯罪 劇情’’'
- 時間
方法1:
reg3= re.compile(’[0-9]{4}’)
result8=re.findall(reg3,film)
print(result8)
方法2:
reg3= re.compile(’\d{4}’)
print(re.findall(reg3,film))
- 地區
reg4= re.compile(’/(.*?)/’)
result9=re.findall(reg4,film)
print(result9)
方法2:
print(film.split(’/’)[-2])
- 導演
reg5= re.compile(‘導演:\s(.*?)\s’)
result10=re.findall(reg5,film)
print(result10)
方法2:
regd = re.compile(‘導演: (.*?) 主演’)
print(re.findall(regd,film))