正則表達示 for Python3
前情提要
從大量的文字內容中找到自己想要的東西,正則似乎是最好的方法.也是寫爬蟲不可缺少的技能.所以,別墨跡了趕緊好好學吧!
教程來自http://www.runoob.com/python3/python3-reg-expressions.html,感謝菜鳥教程.
一. 在Python3中 正則為 re 模塊
import re
二.re.match函數
re.match –>從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話match()就返回none,語法:
re.match(pattern, string, flags = 0)
pattern –> 匹配正則表達式
string –>要匹配的字符串.
flags –> 標誌位,用於控制正則的匹配方式,如:是否區分大小寫,多行匹配等等.
匹配成功re.match方法返回一個匹配的對象,否則返回None.
可以用group(num)或groups()匹配對象函數來獲取匹配表達式.
group(num = 0) –> 匹配的整個表達式的字符串,group()可以一次輸入多個級號,在這種情況下它將返回一個包含那些組所對應值的元組.
groups() –> 返回一個包含所有小組字符串的元組,從1至所含的小組號.
例子:
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import re
print(re.match(‘www’, ‘www.runoob.com).span()) # 在起始位置匹配. –>(0, 3)
print(re.match(‘com’, ‘www.runoob.com’) # 不在起始位置匹配. –> None
例子2:
import re
line = ‘Cats are smarter than dogs’
matchObj = re.match(r‘(.*) are (.*?) .*’, line, re.M|re.I)
if matchObj:
print(‘matchObj.group():’, matchObj.group())
print(‘matchObj.group(1):’, matchObj.group(1))
print(‘matchObj.group(2):’, matchObj.group(2))
else:
print(‘No match!!’)
三. re.search方法
re.search 掃描整個並返回第一個成功的匹配.語法:
re.search(pattern, string, flags=0) –> 參數說明和上面一樣
匹配成功會返回一個匹配的對象,否則返回None.
group(num=0)和groups() 用法和上面一樣.
例子:
import re
print(re.search(‘www’, ‘www.baidu.com’).span()) # 在起起始位置匹配. –> (0,3)
print(re.search(‘com’, ‘www.baidu.com’.span()) # 不在起始位置匹配. –>(11,14)
例子2:
import re
line = ‘Cats are smarter than dogs’
searchObj = re.search(r‘(.*) are (.*?) .*’, line, re.M|re.I)
if searchObj:
print(‘searchObj.group() : ‘, searchObj.group())
print(‘searchObj.group(1) : ‘, searchObj.group(1))
print(‘searchObj.group(2) : ‘, searchObj.group(2))
四.re.match 與 re.search的區別
re.match只匹配字符串的開始,如果字符串開始不符合正則,則匹配失敗,返回None.而re.search匹配整個字符串,直至找到一個匹配.
例子:
import re
line = ‘Cats are smarter than dogs’
matchObj = re.match(r’dogs’, line, re.M|re.I)
if matchObj:
print(‘match–>matchObj.group():’, matchObj.group())
else:
print(‘No match’)
matchObj = re.search(r’dogs’, line, re.M|re.I)
if matchObj:
print(‘search –> matchObj.group():’, matchObj.group())
else:
print(‘No match’)
五.檢索和替換
re.sub(pattren, repl, string, count=0)
參數:
pattren–> 略
repl–>替換的字符串,也可以為一個函數.
string–>要被查找替換的原始字符串.
count–>模式匹配後替換的最大次數,默認0表示替換所有的匹配.
例子:
import re
phone = ‘2004-959-559 # 這是一個電話號碼’
# 刪除註釋
num = re.sub(r’#.*$’, “”, phone)
print(‘電話號碼’, num)
#移除非數字的內容
num = re.sub(r’\D, “”, phone)
print(‘電話號碼:’,num)
六.repl的參數是一個函數
import re
#把匹配的數字*2
def double(matched):
value = int(matched.group(‘value’))
return str(value * 2)
s = ‘A23G4HFD567’
print(re.sub(‘(?P<balue>\d+)’, double, s))
七.正則表達式修飾符 – 可選標誌
正則表達工可以包含一些可選標誌修飾符來控制匹配的械.修飾符被指定為一個可選的標誌.多個標誌可以通過按位OR(|)它們來指定,如re.I|re.M被設置成I和M標誌:
re.l –> 例匹配對大小寫不敏感.
re.L –> 做本地化識別(locale-aware)匹配
re.M –> 多行匹配,影響^和$
re.S –> 使.匹配包括換行在內的所有字符.
re.U –> 根據Unicode字符集解析字符,這個標誌影響 \w , \W , \b , \B
re.X –> 通過給予你更靈活的格式以便你將正則表達式寫得更易於理解.
八.正則表達式模式
模式字符串使用特殊的語法來表示一個正則:
字母和數字表示他們自身.一個正則表達式模式中的字母和數字匹配同樣的字符串.
多數字母和數字前加一個反斜杠時會擁有不同的含義.
標點符號只有被黑底時才匹配自身,否則它們的表示特殊的含義.
反斜杠本身需要使用反斜杠轉義
由於正則表達式通常都包含反斜杠,所以你最好使用原始字符串來表示它們.模式元素(如r’/t’ == ‘//t’)匹配相應的特殊字符.
下面列出了正則表達式模式語法中的特殊元素.如果你使用模式的同時提供了可選的標誌參數,某些模式元素的含義會改變.
^ –> 匹配字符串的開頭
$ –> 匹配字符串的末尾
. –> 匹配任意字符,除了換行符, 當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符.
[…] –> 用來表示一組字符,單獨列出:[amk]匹配’a’,’m’,或’k’
[^…] –> 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符.
re* –> 匹配0個或多個表達式.
re+ –> 匹配1個或多個表達式.
re? –>匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式.
re{n} –>
re{n,} –>精確匹配n個前面表達式.
re{n, m} –>匹配n到m次由前面的下面表達式定義的片段,貪婪方式
a|b –> 匹配a或b
(re) –> G匹配括號內的表達式,也表示一個組
(?imx) –> 正則表達式包含三種可選標誌:i,m,x, 只影響括號中的區域.
(?-imx) –> 正則表達式關閉 i, m, 或 x 可選標誌。只影響括號中的區域。
(?:re) –> 類似 (…), 但是不表示一個組
(?imx: re) –> 在括號中使用i, m, 或 x 可選標誌
(?-imx: re) –> 在括號中不使用i, m, 或 x 可選標誌
(?#…) –> 註釋
(?= re) –> 前向肯定界定符。如果所含正則表達式,以 … 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。
(?! re) –> 前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功
(?> re) –> 匹配的獨立模式,省去回溯。
\w –> 匹配字母數字
\W –> 匹配非字母數字
\s –> 匹配任意空白字符,等價於[\t\n\r\f]
\S –> 匹配任意非空字符
\d –> 匹配任意數字,等份於[0-9]
\D –> 匹配任意非數字
\A –> 匹配字符串開始
\Z –> 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串.
\z –> 匹配字符串結束
\G –> 匹配最後匹配完成的位置.
\b –> 匹配一個單詞邊界,也就是指單詞和空格間的位置.例如,’re\b’可以匹配’never’中的’er’,但是不能匹配’verb’中的’er’
\B –> 匹配非單詞邊界.和\b反過來
\n \t等 –> 匹配一個換行符 制表符等
\1…\9 –> 匹配第n個分組的子表達式.
\10 –> 匹配第n個分組的子表達式,如果它經匹配,否則指的是八進制字符碼的表達式
九.正則表達式實例
python –> 匹配”python“
字符類
[Pp]ython –> ‘Python’或’python’
rub[ye] –> ‘ruby’ 或’rube’
[aeiou] –> 匹配中括號內的任意一個字母
[0-9] –> 匹配任何數字 類似於[0123456789]
[a-z] –> 匹配任何小寫字母
[A-Z] –> 匹配任何大寫字母
[a-zA-z0-9] –> 可以匹配任何字母及數字
[^aeiou] –> 除了aeiou字母以外的所有字符
[^0-9] –> 除了數字外的字符
特殊字符類
. –> 匹配除\n這外的任何單個字符.要匹配包括\n在內的任何字符,請使用[.\n的模式]
\d \D \s \S \w \W 上面都有了
正則表達示 for Python3