1. 程式人生 > >python 模塊之路 re模塊運用

python 模塊之路 re模塊運用

計算器 pan douban odin 函數 源碼 除法 main back

re模塊 正則混合使用       

永遠不要起一個py文件的名字 這個名字和你已知的模塊同名 而且沒有意義 文件名字要有意義

查找:

findall : 匹配所有 每一項都是列表中的一個元素
 ret = re.findall(\d+,sjkhk172按實際花費928) # 正則表達式,帶匹配的字符串,flag
 ret = re.findall(\d,sjkhk172按實際花費928) # 正則表達式,帶匹配的字符串,flag
 print(ret)

 search : 只匹配從左到右的第一個,得到的不是直接的結果,而是一個變量,通過這個變量的group方法來獲取結果
# 如果沒有匹配到,會返回None,使用group會報錯 ret = re.search(\d+,sjkhk172按實際花費928) print(ret) # 內存地址,這是一個正則匹配的結果 print(ret.group()) # 通過ret.group()獲取真正的結果 ret = re.search(\d,owghabDJLBNdgv) print(ret) print(ret.group()) ret = re.search(\d+,sjkhk172按實際花費928) if ret : # 內存地址,這是一個正則匹配的結果 print
(ret.group()) # 通過ret.group()獲取真正的結果
match 從頭開始匹配,相當於search中的正則表達式加上一個^
ret = re.match(\d+$,172sjkhk按實際花費928)
print(ret)

# 字符串處理的擴展 : 替換 切割
# split
s = alex|taibai|egon|
print(s.split(|))
s = alex83taibai40egon25
ret = re.split(\d+,s)
print(ret)

# sub # 誰 舊的 新的 替換次數
ret = re.sub(\d+
,H,alex83taibai40egon25) print(ret) ret = re.sub(\d+,H,alex83taibai40egon25,1) print(ret) # subn 返回一個元組,第二個元素是替換的次數 ret = re.subn(\d+,H,alex83taibai40egon25) print(ret)

re模塊的進階 : 時間 / 空間

compile 節省使用正則表達式解決問題的時間

編譯 正則表達式 編譯成字節碼

在多次使用的過程中 不會多次編譯

ret = re.compile(\d+)   # 已經完成編譯了
print(ret)
res = ret.findall(alex83taibai40egon25)
print(res)
res = ret.search(sjkhk172按實際花費928)
print(res.group())

finditer 節省你使用正則表達式解決問題的空間/內存
ret = re.finditer(\d+,alex83taibai40egon25)
for i in ret:
    print(i.group())

findall 返回列表 找所有的匹配項

search 匹配就 返回一個變量, 通過group取到匹配到的第一個值, 不匹配就返回None , group會報錯

match 相當於search 的正則表達式中加了一個‘ ^‘

spilt 返回列表, 按照正則規則切割, 默認匹配的內容會被切掉

sub / subn 替換, 按照正則規則去尋找要被替換的內容,subn返回元祖, 第二個值是替換的次數

compile 編譯一個正則表達式, 用這個結果去search match findall finditer 能夠節省時間

finditer 返回一個叠代器 所有的結果都在這個叠代器中,需要通過循壞+ group 的形式取值 能夠節省內存

分組在re模塊中的使用

import re

 s = <a>wahaha</a>  # 標簽語言 html 網頁
 ret = re.search(<(\w+)>(\w+)</(\w+)>,s)
 print(ret.group())  # 所有的結果
 print(ret.group(1)) # 數字參數代表的是取對應分組中的內容
 print(ret.group(2))
 print(ret.group(3))

# 為了findall也可以順利取到分組中的內容,有一個特殊的語法,就是優先顯示分組中的內容
 ret = re.findall((\w+),s)
 print(ret)
 ret = re.findall(>(\w+)<,s)
 print(ret)

# 取消分組優先(?:正則表達式)
 ret = re.findall(\d+(\.\d+)?,1.234*4)
 print(ret)

# 關於分組
# 對於正則表達式來說 有些時候我們需要進行分組,來整體約束某一組字符出現的次數
 (\.[\w]+)?

# 對於python語言來說 分組可以幫助你更好更精準的找到你真正需要的內容
 <(\w+)>(\w+)</(\w+)>

 split
 ret = re.split(\d+,alex83taibai40egon25)
 print(ret)
 ret = re.split((\d+),alex83taibai40egon25aa)
 print(ret)

# python 和 正則表達式 之間的特殊的約定

# 分組命名 (?P<這個組的名字>正則表達式)
 s = <a>wahaha</a>
 ret = re.search(>(?P<con>\w+)<,s)
 print(ret.group(1))
 print(ret.group(con))

 s = <a>wahaha</a>
 pattern = <(\w+)>(\w+)</(\w+)>
 ret = re.search(pattern,s)
 print(ret.group(1) == ret.group(3))

# 使用前面的分組 要求使用這個名字的分組和前面同名分組中的內容匹配的必須一致
 pattern = <(?P<tab>\w+)>(\w+)</(?P=tab)>
 ret = re.search(pattern,s)
 print(ret)

 2018-12-06
 2018.12.6
 2018 12 06
 12:30:30

使用正則表達式的技巧

import re

ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
# 從"1-2*(60+(-40.35/5)-(-4*3))"中取整數
 [1, 2, 60, 40, 35, 5, 4, 3]
 print(ret)

# 你要匹配的內容太沒有特點了 容易和你不想匹配的內容混在一起
# 精準的取到整數 過濾掉小數

ret=re.findall(r"\d+\.\d+|\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove(‘‘)
print(ret)

正則表達式如果寫的足夠好的話 能夠最大限度的簡化我們的操作

正則表達式重要到什麽程度

  掌握平時作業

  能夠看懂常用的正則表達式

  並且能夠做出一些公司特異性要求的修改

簡單爬蟲實列

import re

def getPage(url):   # 獲取網頁的字符串
    response = urlopen(url)
    return response.read().decode(utf-8)

def parsePage(s):
    ret = com.finditer(s)  # 從s這個網頁源碼中 找到所有符合com正則表達式規則的內容 並且以叠代器的形式返回
    for i in ret:
        yield {
            "id": i.group("id"),
            "title": i.group("title"),
            "rating_num": i.group("rating_num"),
            "comment_num": i.group("comment_num"),
        }

def main(num):  # 0  25 50  # 這個函數執行10次,每次爬取一頁的內容
    url = https://movie.douban.com/top250?start=%s&filter= % num
    response_html = getPage(url)   # response_html就是這個url對應的html代碼 就是 str
    ret = parsePage(response_html) # ret是一個生成器
    print(ret)
    f = open("move_info7", "a", encoding="utf8")
    for obj in ret:
        print(obj)
        data = str(obj)
        f.write(data + "\n")
    f.close()

com = re.compile(
        <div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>
        .*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)評價</span>, re.S)

count = 0
for i in range(10):
    main(count)
    count += 25

計算器 作業 經典題目

# ret = 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# print(ret)  #偷雞做法   答案直接輸出

# s = ‘1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )‘
# print(eval(s))  # 第二種偷雞   答案直接輸出

思路如下:

s = ‘1 - 2 * 12‘
# 正則表達式 函數 循環

# 匹配內層不再有括號的子表達式
# 計算
# 先計算乘除法
# 再計算加減法
# 一個括號計算完畢
# 將結果和括號進行替換
# 如何處理符號

# 1.先把所有的空格去掉
# 匹配 內層不再有括號的子表達式
# 匹配乘除法
# 匹配加減法
# 2.遠離遞歸,如果要用遞歸,請考慮返回值的問題

拼搏 努力

python 模塊之路 re模塊運用