- 特殊字符
- ^ $ * ? + {2} {2,} {2,5} |
- [] [^] [a-z] .
- \s \S \w \W
- [\u4E00-\u9FA5] () \d
常用的6個re中的函數(shù)
re.compile(pattern,flag)#根據(jù)正則匹配字符串以及附加條件,返回一個pattern對象
re.search(pattern,string)#搜索整個字符串,直到發(fā)現(xiàn)符合正則表達(dá)式的字符串
re.match(pattern,string)#從頭開始檢測字符串是否符合正則表達(dá)式祟同,必須從字符串的第一個字符開始
re.sub(pattern,replacement,string)#將字符串中根據(jù)正則匹配到的字符串用replacement替換
re.split(pattern,string)#根據(jù)正則表達(dá)式分割字符串,將分割后的字符串放到list中返回
re.findall(pattern,string)#根據(jù)正則表達(dá)式分割字符串亚茬,將找到的所有結(jié)果放到list中返回re.match()一些簡單的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 ()為提取字串即提取括號內(nèi)的內(nèi)容蛹磺,其實為反向匹配,貪婪模式
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)容的任何一個
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é))'#提取漢字,不加問號為京大學(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()簡要說明
##查找以id為plist并以<div class="page clearfix">結(jié)尾的代碼
#.*?是一個固定搭配猾普,.和*可以匹配任意多個字符,加上?就是最小匹配本谜,
#也就是我們上面說的非貪婪模式初家,直白的說就是匹配盡可能短的字符串
#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ù)庫
pattern1 = '<div id="plist".*?<div class="page clearfix">'
str1 = re.compile(pattern1,re.S).findall(html)#
- 正則表達(dá)式模式
模式字符串使用特殊的語法來表示一個正則表達(dá)式:
字母和數(shù)字表示他們自身。一個正則表達(dá)式模式中的字母和數(shù)字匹配同樣的字符串乌助。
多數(shù)字母和數(shù)字前加一個反斜杠時會擁有不同的含義溜在。
標(biāo)點符號只有被轉(zhuǎn)義時才匹配自身,否則它們表示特殊的含義他托。
反斜杠本身需要使用反斜杠轉(zhuǎn)義掖肋。
由于正則表達(dá)式通常都包含反斜杠,所以你最好使用原始字符串來表示它們赏参。模式元素(如 r'\t'志笼,等價于 '\t')匹配相應(yīng)的特殊字符。
下表列出了正則表達(dá)式模式語法中的特殊元素把篓。如果你使用模式的同時提供了可選的標(biāo)志參數(shù)纫溃,某些模式元素的含義會改變。
模式 | 描述 | |
---|---|---|
^ | 匹配字符串的開頭 | |
$ | 匹配字符串的末尾 | |
* | 前面的字符可以重復(fù)任意多次 | |
. | 匹配任意字符韧掩,除了換行符紊浩,當(dāng)re.DOTALL標(biāo)記被指定時,則可以匹配包括換行符的任意字符 | |
[...] | 用來表示一組字符,單獨列出:[amk] 匹配 'a','m'或'k' | |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 | |
re* | 匹配0個或多個的表達(dá)式 | |
re+ | 匹配1個或多個的表達(dá)式 | |
re? | 匹配0個或1個由前面的正則表達(dá)式定義的片段坊谁,非貪婪方式 | |
re{ n} | 前面字符出現(xiàn)的次數(shù) | |
re{ n,} | 精確匹配n個前面表達(dá)式 | |
re{ n, m} | 匹配 n 到 m 次由前面的正則表達(dá)式定義的片段费彼,貪婪方式 | |
a | b | 匹配a或b |
(re) | G匹配括號內(nèi)的表達(dá)式,也表示一個組 | |
(?imx) | 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 口芍。只影響括號中的區(qū)域 | |
(?-imx) | 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志箍铲。只影響括號中的區(qū)域 | |
(?: re) | 類似 (...), 但是不表示一個組 | |
(?imx: re) | 在括號中使用i, m, 或 x 可選標(biāo)志 | |
(?-imx: re) | 在括號中不使用i, m, 或 x 可選標(biāo)志 | |
(?#...) | 注釋. | |
(?= re) | 前向肯定界定符。如果所含正則表達(dá)式鬓椭,以 ... 表示虹钮,在當(dāng)前位置成功匹配時成功,否則失敗膘融。但一旦所含表達(dá)式已經(jīng)嘗試,匹配引擎根本沒有提高祭玉;模式的剩余部分還要嘗試界定符的右邊 | |
(?! re) | 前向否定界定符氧映。與肯定界定符相反;當(dāng)所含表達(dá)式不能在字符串當(dāng)前位置匹配時成功 | |
(?> re) | 匹配的獨立模式脱货,省去回溯 | |
\w | 匹配字母數(shù)字及下劃線 | |
\W | 匹配非字母數(shù)字及下劃線 | |
\s | 匹配任意空白字符岛都,等價于 [\t\n\r\f] | |
\S | 匹配任意非空字符 | |
\d | 匹配任意數(shù)字,等價于 [0-9] | |
\D | 匹配任意非數(shù)字 | |
\A | 匹配字符串開始 | |
\Z | 匹配字符串結(jié)束振峻,如果是存在換行臼疫,只匹配到換行前的結(jié)束字符串 | |
\z | 匹配字符串結(jié)束 | |
\G | 匹配最后匹配完成的位置 | |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置扣孟。例如烫堤, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er' | |
\B | 匹配非單詞邊界凤价。'er\B' 能匹配 "verb" 中的 'er'鸽斟,但不能匹配 "never" 中的 'er' | |
\n, \t, 等. | 匹配一個換行符。匹配一個制表符 | |
\1...\9 | 匹配第n個分組的內(nèi)容 | |
\10 | 匹配第n個分組的內(nèi)容利诺,如果它經(jīng)匹配富蓄。否則指的是八進(jìn)制字符碼的表達(dá)式 |