模塊: 是一組功能的集合 模塊的分類: 1.內置模塊,不需要我安裝,解釋器自帶的 2,第三方模塊:需要我們自己安裝的模塊 3.自定義模塊:需要我自己寫的 常用模塊 1,collection,時間模塊,顯示時間,計算時間 2,random,操作隨機數的,生成隨機數 re模塊:
re模塊是python中處理正在表達式的一個模塊在python當中使用正則表達式 正則表達式是一種獨立的規則,獨立的語言 正則表達式可以做什麼,把所有的手機號找出來 #open打開文件夾 #讀取文件str #從一長串字符串中找到11位數 #一個字符一個字符的讀 3.正則表達式, #從大段字符串裏找到符合規則的內容 #判斷摸個字符串裏合格的內容 #表單驗證:手機qq號,郵箱,銀行卡,省份證 #爬蟲會用到正則表達式 #日誌記錄2018-2-11 22:20......花的所有錢 #什麼是日誌 #正則表達式只和字符串打交道 規則: 字符串 從字符串當中找到符合規則的內容 字符組: []寫在括號裏的內容,都出現在下面的摸一個字符的位置上都是符合規則的 http://tool.chinaz.com/regex 站長工具網站 [0-9] 匹配數字 [a-z] 匹配字母 [A-Z] 匹配大寫字母 [a-zA-Z] 匹配大寫小寫字母 [a-zA-Z0-9] 匹配大寫字母小寫字母和數字 [a-zA-Z0-9_]匹配大寫字母小寫字母和數字和下劃線 元字符: \w :匹配數字字母下劃線,word關鍵字[a-zA-Z0-9] \d :匹配所有的數字,digit關鍵字[0-9] \s :匹配所有的空白符,包括了回車/換行符 ,製表符 空格 \t :匹配製表符tab \n :匹配換行回車 \ :匹配空格 \w 匹配字母和數字,如果是一個剛代表轉義符, 轉義w,讓w具有特殊的意義,在正則表達式中代表匹配數字 字母下劃線. 轉義符一對纔有意義.要想匹配\\w需要\\\\w來轉義 \W \D \S 剛好和小寫的相反匹配 \S :取所有的非空白,那麼使用\s\S就是取全集了 [\s\S] [/d/D] [/W/w] 就是三組全集了 \b 表示匹配單單詞的邊界 \w\d\s (\n\t) \D\S\W \b \& 匹配字符串的結尾 \^ 匹配字符串的開始 ^13689297848& 匹配的內容完全一模一樣 字符組: . :表示匹配所有除了了換行符以外的所有字符 [] :只要出現在括號裏的內容都可以被匹配 [^] :只要不出現在中括號裏的內容都會匹配 有一些有特殊意義的字符串進入字符組中會恢復他本來的意思 : . [] () a|b :或 符合a規則或者b規則的都可以匹配 如果A規則是b規則的一部分,且a規則比b 規則要長,複雜,把,複雜的長的寫照前面 分組: 表示給幾個字符加上量詞的約束需求的時候,就把量詞分在一個組裏面 量詞: 1.{n}表示這個量詞之前字符出現n次 2,{n,}表示這個量詞之前的字符至少出現n次 3,{n,m}表示這個量詞之前的字符出現n-m次 ? 表示匹配的的量詞出現o次或者1次,表示可有可無 + 表示匹配的量詞的字符出現1次或者多次 * 表示匹配量詞之前的字符出現0次或者多次 正則表達式的特性: 貪婪匹配,: 在允許的範圍內儘量多的匹配 \d+?8 加上?表示非貪婪匹配,只匹配第一個8出現爲止 非貪婪模式: /惰性匹配:在量詞的後面加上? .*?x 表示匹配任意非換行符字符,任意次,直到遇到x出現爲止(爬蟲常用) print(r'\\n') print(r'\n') 關於字符串挪到python中的轉義的問題,只需要在工具中測試完畢了,挪到python當中加上r,r''即可使用 練習題 1,匹配整數 \d+ 2,匹配小數 \d+\.\d+ 3,匹配小數或者整數 \d+\.\d+|d+ \d+(\.\d+)?
正則表達式描述:
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個‘規則字符串’,這個‘規則字符串’用來
表達對字符串的一種過濾邏輯。
在線測試工具:http://tool.chinaz.com/regex/
需要明確的是正則表達式只和字符串相關。
正則表達式基礎使用參考:http://tool.chinaz.com/regex/
re 模塊中常用功能函數
1. compile()
編譯正則表達式模式,返回一個對象的模式。(可以把那些常用的正則表達式編譯成正則表達式對象,這樣可以提高一點效率。)
格式:
1 2 3 |
|
import re
s1 = 'have a good day.'
rr = re.compile("\w*oo\w*")
print(rr.findall(s1)) # 查看字符串中包含'oo'的單詞
# 執行結果:
# ['good']
re_compile.py
2. match()
描述:
決定RE是否在字符串剛開始的位置匹配。
注意:
這個方法並不是完全匹配,當pattern結束時,若string還有剩餘字符,仍然視爲成功。想要完全匹配,可以在表達式末尾加上邊界匹配符 '$'
格式:
1 |
|
實例:
import re
s1 = 'runnicegoodrunbetterrun'
# rr = re.match('run', 'nicegoodrun better.run')
r1 = re.match('run', 'runnicegoodrunbetterrun').group()
r2 = re.match('run', 'Runnicegoodrunbetterrun', re.I).group() # re.I 忽視大小寫
print('r1:', r1)
print('r2:', r2)
# 執行結果:
# r1: run
# r2: Run
re_match.py
3. search()
re.search函數會在字符串內查找模式匹配,只要找到第一個匹配然後返回,如果字符串沒有匹配,則返回None
1 |
|
實例:
import re
s1 = 'run nice good run better rungood'
rr = re.search("good", s1).group() # 只會匹配到一個就直接返回
print(rr)
# 執行結果:
# good
re_search.py
注意:
match和search一旦匹配成功,就是一個 match object 對象,而match object對象有以下方法:
- group() 返回被 RE 匹配的字符串
- start() 返回匹配開始的位置
- end() 返回匹配結束的位置
- span() 返回一個元組包含匹配的位置
- group() 返回 re 整體匹配的字符串,可以一次輸入多個組號,對應組號匹配的字符串。
a.group() 返回re整體匹配的字符串
b.group(n, m) 返回組號爲n,m所匹配的字符串,如果組號不存在,則返回indexError異常
c.groups() groups() 方法返回一個包含正則表達式中所有小組字符串的元組,從 1 到所含的小組號,通常groups()不需要參數,返回一個元組,
元組中的元就是正則表達式中定義的組
import re
a = "123abc456"
rr = re.compile("([0-9]*)([a-z]*)([0-9]*)")
print('group(0):', rr.search(a).group(0)) # group(0) 返回正則匹配到的全部內容
print('group(1):', rr.search(a).group(1)) # group(1) 列出第一個 ([a-z]*) 匹配到的部分
print('group(2):', rr.search(a).group(2)) # group(2) 列出第二個 ([0-9]*) 匹配到的部分
print('group(3):', rr.search(a).group(3)) # group(3) 列出第三個 ([0-9]*) 匹配到的部分
print('groups():', rr.search(a).groups()) # groups() 以元組的形式列出每個括號中匹配到的內容
# 執行結果:
# group(0): 123abc456
# group(1): 123
# group(2): abc
# group(3): 456
# groups(): ('123', 'abc', '456')
re_group.py
4. findall()
描述:
re.findall 遍歷匹配,可以獲得字符串中所有匹配的字符串,返回一個列表
格式:
1 |
|
實例:
import re
p = re.findall("(\d+)", 'asdf12sdf123ad') # 當匹配到多個值,以列表的形式返回
print(p)
# 執行結果:
# ['12', '123']
import re
tt = 'ggood booyy nice day'
print(re.findall("\w*oo\w*", tt))
print(re.findall("(\w)*oo(\w)", tt)) # 通過小括號分組,得到列表中的元組
# 執行結果:
# ['ggood', 'booyy']
# [('g', 'd'), ('b', 'y')]
5. finditer()
描述:
搜索string,返回一個順序訪問每一個匹配結果(Match對象)的迭代器。找到RE匹配的所有部分,並把他們作爲一個迭代器返回。
格式:
re.finditer(pattern, string, flags=0)
實例:
import re
iter = re.finditer('\d+', 'adfasdfq2313sdasf2qe4123')
for i in iter:
print(i) # finditer返回的是一個迭代器
print(i.group()) # 返回一組匹配到的部分
print(i.span()) # 返回一個元組包含匹配(開始,結束)的位置
# 執行結果:
# <_sre.SRE_Match object; span=(8, 12), match='2313'>
# 2313
# (8, 12)
# <_sre.SRE_Match object; span=(17, 18), match='2'>
# 2
# (17, 18)
# <_sre.SRE_Match object; span=(20, 24), match='4123'>
# 4123
# (20, 24)
6. split()
描述:
按照能夠匹配的字串將 string 分割後返回列表。
可以使用re.split來分割字符串,如:re.split(r'\s+', text);將字符串按空格分割成一個單詞列表。
1 2 3 4 5 |
|
格式:
re.split(pattern, string[, maxsplit])
maxsplit用於指定最大分割次數,不指定將全部分割。
實例:
import re
print(re.split('\d+','one1two2three3four4five5'))
# 執行結果:
# ['one', 'two', 'three', 'four', 'five', '']
re.split 用法在這裏要注意下:
當正則中使用分組和不使用分組返回的是不同的結果:
import re
print(re.split('[a-z]','111a222'))
print(re.split('([a-z])','111a222'))
# 執行結果:
# ['111', '222'] # 未使用分組
# ['111', 'a', '222'] # 使用分組
7. sub()
使用re替換string中每一個匹配的子串後返回替換後的字符串
格式:
re.sub(pattern, repl, string, count)
默認全部替換
實例:
import re
s1 = '1 + 2 + (4 / 5 + 2)'
print(re.sub(' ', '', s1)) # 直接去除計算表達式中的空格
# 執行結果:
# 1+2+(4/5+2)
8. subn()
描述:
返回元組類型,最後一位爲替換的次數
格式:
subn(pattern, repl, string, count=0, flags=0)
實例:
mport re
s1 = '1 + 2 + (4 / 5 + 2)'
print(re.subn(' ', '', s1)) # 直接去除計算表達式中的空格
# 執行結果:
# ('1+2+(4/5+2)', 9) # 替換了9次空格
re模塊方法區分
1. re.match與re.search與re.findall的區別:
re.match 只是匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None
re.search 匹配整個字符串,直到直到一個匹配。
import re
s1 = 'abc123'
print(re.match("[\d]", s1)) # 從頭開始搜索數字,如果開始沒有匹配到返回None
print(re.search("[\d]", s1).group()) # 從頭開始搜索數字,匹配到第一個直接返回一個迭代器
print(re.findall("[\d]", s1)) # 遍歷查找字符串中的數字部分,查找到每個數字都以元素的形式展現
# 執行結果:
# None
# 1
# ['1', '2', '3']
2. 貪婪匹配和非貪婪匹配
*?,+?,??,{m,n}? 前面的*,+,?等都是貪婪匹配,也就是儘可能匹配,後面加?號使其變成惰性匹配
實例1:
import re
a = re.findall(r"a(\d+?)",'a23b') # 在正則後面加'?',表示惰性匹配,匹配到一個就直接返回
print(a)
b = re.findall(r"a(\d+)",'a23b') # 貪婪匹配
print(b)
# 執行結果:
# ['2']
# ['23']
實例2:
a = re.match('<(.*)>','<H1>title<H1>').group()
print(a)
b = re.match('<(.*?)>','<H1>title<H1>').group()
print(b)
# 執行結果:
# <H1>title<H1>
# <H1>
參考鏈接:
https://www.cnblogs.com/tina-python/p/5508402.html
http://tool.chinaz.com/regex/
http://www.cnblogs.com/Eva-J/articles/7228075.html#_label10