- 特殊字符
- ^ $ * ? + {2} {2,} {2,5} |
- [] [^] [a-z] .
- \s \S \w \W
- [\u4E00-\u9FA5] () \d
常用的6個(gè)re中的函數(shù)
re.compile(pattern,flag)#根據(jù)正則匹配字符串以及附加條件,返回一個(gè)pattern對(duì)象
re.search(pattern,string)#搜索整個(gè)字符串,直到發(fā)現(xiàn)符合正則表達(dá)式的字符串
re.match(pattern,string)#從頭開始檢測(cè)字符串是否符合正則表達(dá)式,必須從字符串的第一個(gè)字符開始
re.sub(pattern,replacement,string)#將字符串中根據(jù)正則匹配到的字符串用replacement替換
re.split(pattern,string)#根據(jù)正則表達(dá)式分割字符串,將分割后的字符串放到list中返回
re.findall(pattern,string)#根據(jù)正則表達(dá)式分割字符串,將找到的所有結(jié)果放到list中返回re.match()一些簡(jiǎn)單的Python示例
import re
line = 'bobby123'
regex_str = "^b.*"#以b開頭的任意字符
if re.match(regex_str,line):
print('yes')
import re
line = 'bobby123'
regex_str = "^b.*3$"#以b開頭以3結(jié)尾的任意字符
if re.match(regex_str,line):
print('yes')
import re
line = 'boooooooobby123'
#regex_str = ".*(b.*b).*"# bb ()為提取字串即提取括號(hào)內(nèi)的內(nèi)容,其實(shí)為反向匹配,貪婪模式
regex_str = ".*?(b.*b).*"#boooooooobb 左面非貪婪模式,從左面開始匹配,后面為貪婪模式
regex_str = ".*?(b.*?b).*"#boooooooob
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
import re
line = 'booobaaooooobbbaby123'
regex_str = ".*(b.+b).*"# +出現(xiàn)最少一次 bab 貪婪模式一直匹配到最后
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
import re
line = 'booobaaooooobbbaaaaaaaaby123'
regex_str = ".*(b.{2,5}b).*"# {}前面字符出現(xiàn)的次數(shù),在這里為任意字符出現(xiàn)最少2次最多5次
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
import re
line = 'boobby123'
regex_str = '((bobby|boobby)123)'
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#boobby123
import re
line = 'boobby123'
regex_str = '([abcd]oobby123)'#[]為里面內(nèi)容的任何一個(gè)
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#boobby123
import re
line = '14782902222'
#regex_str = '(1[48357][0-9]{9})'#[0-9]0-9的任意數(shù)字出現(xiàn)9次 14782902222
regex_str = '(1[48357][^1]{9})'#不等于1出現(xiàn)9次
# 區(qū)間 任選 [.*]內(nèi)的字符不在代表特殊含義
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#14782902222
import re
line = '你ss好'
regex_str = '(你\S+好)'#匹配任意非空字符
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#14782902222
import re
line = 'study in 南京大學(xué)'
regex_str = '.*?([\u4E00-\u9FA5]+大學(xué))'#提取漢字,不加問(wèn)號(hào)為京大學(xué)
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#南京大學(xué)
import re
line = 'XXX出生于2001年9月9日'
#line = 'XXX出生于2001/9/9'
#line = 'XXX出生于2001-9-9'
#line = 'XXX出生于2001-09-09'
#line = 'XXX出生于2001-09'
regex_str = '.*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))'#
match_obj = re.match(regex_str,line)
print(match_obj)
if match_obj:
print(match_obj.group(1))#
- re.compile()簡(jiǎn)要說(shuō)明
##查找以id為plist并以<div class="page clearfix">結(jié)尾的代碼
#.*?是一個(gè)固定搭配,.和*可以匹配任意多個(gè)字符,加上?就是最小匹配,
#也就是我們上面說(shuō)的非貪婪模式,直白的說(shuō)就是匹配盡可能短的字符串
#flags定義包括:
#re.I:忽略大小寫
#re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
#re.M:多行模式
#re.S:' . '并且包括換行符在內(nèi)的任意字符(注意:' . '不包括換行符)
#re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫(kù)
pattern1 = '<div id="plist".*?<div class="page clearfix">'
str1 = re.compile(pattern1,re.S).findall(html)#
- 正則表達(dá)式模式
模式字符串使用特殊的語(yǔ)法來(lái)表示一個(gè)正則表達(dá)式:
字母和數(shù)字表示他們自身。一個(gè)正則表達(dá)式模式中的字母和數(shù)字匹配同樣的字符串。
多數(shù)字母和數(shù)字前加一個(gè)反斜杠時(shí)會(huì)擁有不同的含義。
標(biāo)點(diǎn)符號(hào)只有被轉(zhuǎn)義時(shí)才匹配自身,否則它們表示特殊的含義。
反斜杠本身需要使用反斜杠轉(zhuǎn)義。
由于正則表達(dá)式通常都包含反斜杠,所以你最好使用原始字符串來(lái)表示它們。模式元素(如 r'\t',等價(jià)于 '\t')匹配相應(yīng)的特殊字符。
下表列出了正則表達(dá)式模式語(yǔ)法中的特殊元素。如果你使用模式的同時(shí)提供了可選的標(biāo)志參數(shù),某些模式元素的含義會(huì)改變。
| 模式 | 描述 | |
|---|---|---|
| ^ | 匹配字符串的開頭 | |
| $ | 匹配字符串的末尾 | |
| * | 前面的字符可以重復(fù)任意多次 | |
| . | 匹配任意字符,除了換行符,當(dāng)re.DOTALL標(biāo)記被指定時(shí),則可以匹配包括換行符的任意字符 | |
| [...] | 用來(lái)表示一組字符,單獨(dú)列出:[amk] 匹配 'a','m'或'k' | |
| [^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 | |
| re* | 匹配0個(gè)或多個(gè)的表達(dá)式 | |
| re+ | 匹配1個(gè)或多個(gè)的表達(dá)式 | |
| re? | 匹配0個(gè)或1個(gè)由前面的正則表達(dá)式定義的片段,非貪婪方式 | |
| re{ n} | 前面字符出現(xiàn)的次數(shù) | |
| re{ n,} | 精確匹配n個(gè)前面表達(dá)式 | |
| re{ n, m} | 匹配 n 到 m 次由前面的正則表達(dá)式定義的片段,貪婪方式 | |
| a | b | 匹配a或b |
| (re) | G匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組 | |
| (?imx) | 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 。只影響括號(hào)中的區(qū)域 | |
| (?-imx) | 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志。只影響括號(hào)中的區(qū)域 | |
| (?: re) | 類似 (...), 但是不表示一個(gè)組 | |
| (?imx: re) | 在括號(hào)中使用i, m, 或 x 可選標(biāo)志 | |
| (?-imx: re) | 在括號(hào)中不使用i, m, 或 x 可選標(biāo)志 | |
| (?#...) | 注釋. | |
| (?= re) | 前向肯定界定符。如果所含正則表達(dá)式,以 ... 表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗。但一旦所含表達(dá)式已經(jīng)嘗試,匹配引擎根本沒(méi)有提高;模式的剩余部分還要嘗試界定符的右邊 | |
| (?! re) | 前向否定界定符。與肯定界定符相反;當(dāng)所含表達(dá)式不能在字符串當(dāng)前位置匹配時(shí)成功 | |
| (?> re) | 匹配的獨(dú)立模式,省去回溯 | |
| \w | 匹配字母數(shù)字及下劃線 | |
| \W | 匹配非字母數(shù)字及下劃線 | |
| \s | 匹配任意空白字符,等價(jià)于 [\t\n\r\f] | |
| \S | 匹配任意非空字符 | |
| \d | 匹配任意數(shù)字,等價(jià)于 [0-9] | |
| \D | 匹配任意非數(shù)字 | |
| \A | 匹配字符串開始 | |
| \Z | 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串 | |
| \z | 匹配字符串結(jié)束 | |
| \G | 匹配最后匹配完成的位置 | |
| \b | 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er' | |
| \B | 匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er' | |
| \n, \t, 等. | 匹配一個(gè)換行符。匹配一個(gè)制表符 | |
| \1...\9 | 匹配第n個(gè)分組的內(nèi)容 | |
| \10 | 匹配第n個(gè)分組的內(nèi)容,如果它經(jīng)匹配。否則指的是八進(jìn)制字符碼的表達(dá)式 |