正则表达式强化,爬虫练习
生活随笔
收集整理的這篇文章主要介紹了
正则表达式强化,爬虫练习
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
re模塊下的常用方法
?
import re ret = re.findall('\d+(\.\d+)?', '1.23+2.34')print(ret) 結(jié)果: ['.23','.34']
# findall的正則表達式里面有分組(),()里面的內(nèi)容優(yōu)先顯示 ret = re.findall('\d+(?:\.\d+)?', '1.23+2.34')
print(ret) 結(jié)果: ['1.23','2.34']
# ?:寫在一個分組的最開始,表示在findall方法中取消這個分組的優(yōu)先級 ret = re.findall('a', 'eva egon yuan') # 返回所有滿足匹配條件的結(jié)果,放在列表里
print(ret) #結(jié)果 : ['a', 'a']
ret = re.search('a', 'eva egon yuan').group()
print(ret) #結(jié)果 : 'a' # 函數(shù)會在字符串內(nèi)查找模式匹配,只到找到第一個匹配然后返回一個包含匹配信息的對象,該對象可以
# 通過調(diào)用group()方法得到匹配的字符串,如果字符串沒有匹配,則返回None。
ret = re.match('a', 'abc').group() # 同search,不過是在字符串開始處進行匹配,默認加'^',沒有返回None
print(ret) #結(jié)果 : 'a'
ret = re.split('[ab]', 'abcd')
# 先按'a'分割得到''和'bcd',在對''和'bcd'分別按'b'分割 print(ret) # ['', '', 'cd']
ret = re.split('\d+','alex123wusir456')
print(ret) #['alex','wusir',''] ret = re.split('(\d+)','alex123wusir456')
print(ret) #['alex','123','wusir','456','']
# split中如果帶有分組(),會在分割的同時保留被分割內(nèi)容中帶分組的部分 ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1) #將數(shù)字替換成'H',參數(shù)1表示只替換1個
print(ret) # evaHegon4yuan4
ret = re.subn('\d', 'H', 'eva3egon4yuan4') #將數(shù)字替換成'H',返回元組(替換的結(jié)果,替換了多少次)
print(ret) #('evaHegonHyuanH',3)
obj = re.compile('\d{3}') # 將正則表達式編譯成為一個正則表達式對象,規(guī)則要匹配的是3個數(shù)字 ret = obj.search('abc123eeee') # 正則表達式對象調(diào)用search,參數(shù)為待匹配的字符串 print(ret.group()) #結(jié)果 : 123import re ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一個存放匹配結(jié)果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一個結(jié)果 ret.__next__ == next(ret) print(next(ret).group()) #查看第二個結(jié)果 print([i.group() for i in ret]) #查看剩余的左右結(jié)果 3 4 7 8 4
綜合練習與擴展
1、匹配標簽
import reret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") #還可以在分組中利用?P<name>的形式給分組起名字 #獲取的匹配結(jié)果可以直接用group('名字')拿到對應(yīng)的值 print(ret.group('tag_name')) #結(jié)果 :h1 print(ret.group()) #結(jié)果 :<h1>hello</h1> ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>") #如果不給組起名字,也可以用\序號來找到對應(yīng)的組,表示要找的內(nèi)容和前面的組內(nèi)容一致 #獲取的匹配結(jié)果可以直接用group(序號)拿到對應(yīng)的值 print(ret.group(1)) # 結(jié)果:h1 print(ret.group()) #結(jié)果 :<h1>hello</h1>2、匹配整數(shù)
import reret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #['1', '2', '60', '40', '35', '5', '4', '3'] ret=re.findall(r"-?\d+\.\d+|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #['1', '-2', '60', '', '5', '-4', '3'] ret.remove("") print(ret) #['1', '-2', '60', '5', '-4', '3']3、數(shù)字匹配
1、 匹配一段文本中的每行的郵箱http://blog.csdn.net/make164492212/article/details/516566382、 匹配一段文本中的每行的時間字符串,比如:‘1990-07-12’;分別取出1年的12個月(^(0?[1-9]|1[0-2])$)、一個月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$3、 匹配qq號。(騰訊QQ號從10000開始) [1,9][0,9]{4,}4、 匹配一個浮點數(shù)。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d*5、 匹配漢字。 ^[\u4e00-\u9fa5]{0,}$ 6、 匹配出所有整數(shù)4、爬蟲練習
import re import json from urllib.request import urlopendef getPage(url):response = urlopen(url)return response.read().decode('utf-8')def parsePage(s):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)ret = com.finditer(s)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):url = 'https://movie.douban.com/top250?start=%s&filter=' % numresponse_html = getPage(url)ret = parsePage(response_html)print(ret)f = open("move_info7", "a", encoding="utf8")for obj in ret:print(obj)data = str(obj)f.write(data + "\n")count = 0 for i in range(10):main(count)count += 25 flags有很多可選值:re.I(IGNORECASE)忽略大小寫,括號內(nèi)是完整的寫法 re.M(MULTILINE)多行模式,改變^和$的行為 re.S(DOTALL)點可以匹配任意字符,包括換行符 re.L(LOCALE)做本地化識別的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當前環(huán)境,不推薦使用 re.U(UNICODE) 使用\w \W \s \S \d \D使用取決于unicode定義的字符屬性。在python3中默認使用該flag re.X(VERBOSE)冗長模式,該模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注釋 # 正則表達式# 元字符# 量詞# 小規(guī)則# 貪婪和惰性匹配# 分組命名# 如果在匹配的時候遇到了沒有特點的內(nèi)容,# 只能通過匹配不想要的內(nèi)容來從中摘取想要的內(nèi)容# findall和split的分組優(yōu)先# flags參數(shù)# 每一小段規(guī)則的元素的排放順序# re模塊# 基礎(chǔ)匹配# 分割和替換# 代碼優(yōu)化 # 模塊 **** # 什么是模塊? # py文件 # c語言編譯之后的文件 # 寫好的代碼集合 直接調(diào)用它的功能 # import time # time.sleep()# 為什么要有模塊? # 內(nèi)存空間是有限的,存放在硬盤里,當你需要的時候加載到我的內(nèi)存 # 把豐富的功能封裝在一個文件里,等用的時候直接導(dǎo)入內(nèi)存就可以使用# 有哪些種類的模塊? # 內(nèi)置模塊 # 擴展模塊# django# 安裝 : pip3 install 模塊名 # 自定義模塊# 登錄# 寫日志# 分模塊: 功能獨立\防止代碼過長?
轉(zhuǎn)載于:https://www.cnblogs.com/molieren/p/9321572.html
總結(jié)
以上是生活随笔為你收集整理的正则表达式强化,爬虫练习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript内置对象Date常用
- 下一篇: Navicat Premium创建MyS