2. 正則表達式---提取字符串

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) # 沒有內容

image_1cvg14vns1p46i8an9b1nkh1a2s9.png-63.4kB

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)

image_1cvg19pqb1qv8gho17n1fipq09m.png-92.5kB

^ 查找以什麼爲開頭的
$ 查找以什麼爲結尾的

3. . (貪婪模式) 和 .*? (非貪婪模式)*

(1) 貪婪模式 .*

reg = re.compile(‘a.*b’) # 運行結果 [‘a123b456b789b’]

image_1cvg1n20ukc25sjqcm1bqtarg13.png-57kB

(2) 非貪婪模式 .*?

? 表示零個或者一個

reg = re.compile(‘a.*?b’) # 運行結果 [‘a123b’]
str3=‘a123b456b789b’
result3=re.findall(reg,str3)
print(result3)

image_1cvg1qirs16ui1d5ret5dochfv1g.png-35kB

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)

image_1cvg21rak12431sma1um71d5r3qo2d.png-74.1kB

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)

image_1cvg27p571an41pohp5u1gt311f2q.png-99.1kB

6. 提取中文 [\u4E00-\u9FA5]

reg = re.compile(’[\u4E00-\u9FA5]+’)
strang=‘張三:20,李四:22,王五:25’
result = re.findall(reg,strang)
print(result)

image_1cvg2kl6b16i21krd5tk18c3fmf37.png-51.1kB

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)

image_1cvg2ptvsf23i8r1n1dguv19mi54.png-42.1kB

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’]

image_1cvg2t67b5vq1aufss9144f17d95h.png-86.3kB

(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))

image_1cvg3a9u84f31h78lo84ga151u5u.png-48.4kB

- 地區

reg4= re.compile(’/(.*?)/’)
result9=re.findall(reg4,film)
print(result9)

方法2:
print(film.split(’/’)[-2])

image_1cvg3jnn075l1ufd101913301d426b.png-47.1kB

- 導演

reg5= re.compile(‘導演:\s(.*?)\s’)
result10=re.findall(reg5,film)
print(result10)

方法2:
regd = re.compile(‘導演: (.*?) 主演’)
print(re.findall(regd,film))

image_1cvg3ksbf16pr1pj9a202n448b78.png-39.4kB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章