039 Python語(yǔ)法之正則表達(dá)式

正則的基本語(yǔ)法

語(yǔ)法 說(shuō)明 表達(dá)式實(shí)例 匹配的字符串
字符 - - -
一般的字符 abc等任意你寫(xiě)的字符串 "abc" "abc"
. 匹配任意除了換行符"\n"之外的字符 "." "a"
\ 轉(zhuǎn)義字符 "a\.c" "a.c"
[...] 多個(gè)字符選一個(gè) "a[bcd]e" "abe" "ace" "ade"
字符集
\d 數(shù)字0-9,等價(jià)于正則[0-9] "a\\dc" "a1c"
\D 非數(shù)字其他字符 \D "a" "b" "c"
\s 空白字符[空格\t\r\n\f\v] "a\sc" "a c" "a\tc" "a\r\nc"
\S 非空白字符[^\s] "a\Sc" "abc"
\w 字母數(shù)字下劃線[A-Za-z0-9_],包括中文,不匹配標(biāo)點(diǎn)符號(hào) "a\wc" "abc" "a_c" "a1c"
\W 非字母數(shù)字下劃線[^A-Za-z0-9_],包括空白字符,不包括中文,匹配標(biāo)點(diǎn)符號(hào) "a\Wc" "a c" "a你c"
數(shù)量詞
* 匹配它前面一個(gè)字符0或無(wú)限次 "abc* "ab" "abc" "abccccc"
+ 匹配它前面一個(gè)字符1或無(wú)限次 "abc*" "abc" "abcccc"
? 匹配它前面一個(gè)字符0或1次 "abc?" "ab" "abc"
{m} 匹配它前面一個(gè)字符m次 "ab{2}c" "abbc"
{m, n} 匹配它前面一個(gè)字符m-n次 "ab{1,2}c" "abc" "abbc"
*? +? ?? {m, n}? 使數(shù)量變成非貪婪模式 "ab{1,2}c" "abc" "abbc"
邊界匹配
^ 匹配行的開(kāi)頭 ^abc abc
$ 匹配行的末尾 abc$ abc
\A 匹配字符串開(kāi)頭 \Aabc abc
\Z 匹配字符串末尾 abc\Z abc
\b 匹配\w\W之間,后面碰見(jiàn)空白字符或者符號(hào)就匹配,只匹配字母,不匹配數(shù)字和中文 a\b!bc a!bc
\B 非\b[^\b],后面不需要跟上分隔符 a\Bbc abc
邏輯分組
左右任意一個(gè) "abc | bcd" "abc" "bcd"
(...) 分組,下標(biāo)從1開(kāi)始 "(abc){2}" "(abc)\1" "abcabc"
<num> 引用編號(hào)為<num>的分組匹配到的字符串 "(name)(id)\1\2" "nameidnameid"
(?P<name>...) 分組,除了原有的編號(hào)之外再指定一個(gè)別名 "(?P<id>abc){2}" "abcabc"
(?P=name) 引用別名為<name>的分組匹配到的字符串 "(?P<id>\d)abc(?P=id)" 1abc5
特殊構(gòu)造
(?:...) (...)的不分組版本,后面可以接數(shù)量詞 (?:abc){2} abcabc
(?iLmsux) ?后面的每一個(gè)字符都是一種匹配模式 (?i)abc AbC
(?#...) 正則表達(dá)式的注釋 abc(?#comment)123 abc123
(?=...) 之后的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 a(?=\d) 后面是數(shù)字的 a字符串(a1)
(?!...) 之后的字符串內(nèi)容需要不匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 a(?!\d) 后面不是數(shù)字的 a字符串(ab)
(?<=...) 之前的字符串內(nèi)容需要匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 a(?<=\d) 前面是數(shù)字的 a字符串(1a)
(?<!...) 之前的字符串內(nèi)容不匹配表達(dá)式才能成功匹配,括號(hào)內(nèi)的是規(guī)則,不參與匹配內(nèi)容 a(?<!\d) 前面不是數(shù)字的 a字符串(ba)
(?(id/name)yes-pattern|nopattern) -暫時(shí)不寫(xiě),后面理解了再寫(xiě)上去- (\d)abc(?(1)\d|abc) -

貪婪與非貪婪模式

  1. Python中的數(shù)量詞默認(rèn)是貪婪模式的,總是默認(rèn)嘗試匹配更多的字符,非貪婪模式則是盡可能少的匹配字符

貪婪模式的例子

pat = re.compile("ab*")
str1 = pat.findall("abbbbbbbbb")
print(str1)

---------------
['abbbbbbbbb']

非貪婪模式的例子

pat = re.compile("ab*?")
str1 = pat.findall("abbbbbbbbb")
print(str1)

---------------
['a']

反斜杠的困擾

  1. 表示\d可以用r"\d"代替"\\d"
  2. 表示\可以用r"\\"替代"\\\\"

re模塊-正則的七個(gè)方法

match(pat, orginStr[, flag])

m = re.match(pat, orginStr[, flag])
m.string

match方法解釋

  1. 從原始字符串第一個(gè)字符開(kāi)始,匹配正則的規(guī)則
  2. 如果不是從第一個(gè)字符開(kāi)始就匹配不到
  3. 參數(shù)1:正則表達(dá)式
  4. 參數(shù)2:原始的字符串
  5. 參數(shù)3:匹配模式(可選參數(shù))

match方法返回值的屬性

  1. m.string: 匹配時(shí)使用的文本
  2. m.re: 匹配時(shí)使用的Pattern對(duì)象
  3. m.pos: 文本中正則表達(dá)式開(kāi)始搜索的索引
  4. m.endpos: 文本中正則表達(dá)式結(jié)束搜索的索引
  5. m.lastindex: 最后一個(gè)被捕獲的分組在文本中的索引
  6. m.lastgroup: 最后一個(gè)被捕獲的分組的別名

match方法返回值的方法

  1. re.group(group1...):獲得一個(gè)或多個(gè)分組截獲的字符串;指定多個(gè)參數(shù)時(shí)將以元組形式返回,group1可以是編號(hào),也可以是別名
  2. re.groups([default]):以元組的形式返回全部分組捕獲的字符串,如果沒(méi)有找到返回default設(shè)置的值,默認(rèn)返回None
  3. groupdict([default]):返回以有別名的組的別名為鍵飞涂、以該組截獲的子串為值的字典,沒(méi)有別名的組不包含在內(nèi)
  4. start([group]):返回指定的組截獲的子串在string中的起始索引(子串第一個(gè)字符的索引).group默認(rèn)值為0
  5. end([group]):返回指定的組截獲的子串在string中的結(jié)束索引(子串最后一個(gè)字符的索引+1).group默認(rèn)值為0
  6. span([group]):返回(start(group),end(group))
  7. expand(template):將匹配到的分組代入template中然后返回

search()

compile

pat = re.compile("ab*?")    # 得到一個(gè)正則表達(dá)式的對(duì)象

compile(pat[,flag])

  1. 第一個(gè)參數(shù)是正則表達(dá)式
  2. 第二個(gè)參數(shù)是匹配模式

compile匹配模式

模式 詳解
re.I/re.IGNORECASE 忽略大小寫(xiě)
re.M/re.MULTILINE 多行模式,改變'^'和'$'的行為
re.S(re.DOTALL) 點(diǎn)任意匹配模式,改變'.'的行為
re.L(re.LOCALE) 使預(yù)定字符類 \w \W \b \B \s \S 取決于當(dāng)前區(qū)域設(shè)定
re.U(re.UNICODE) 使預(yù)定字符類 \w \W \b \B \s \S \d \D
re.X(re.VERBOSE) 詳細(xì)模式,可以是多行,忽略空白字符,可以加入注釋

escape(str)

re.escape("\d")  --> \\d

escape方法詳解

  1. 用于將元字符串進(jìn)行轉(zhuǎn)義后再返回
  2. 感覺(jué)沒(méi)有半點(diǎn)用

findall()

split()

sub()\subn()

purge():清空緩存中的正則表達(dá)式,等待驗(yàn)證,有點(diǎn)坑

re.purge() --> 返回值是None

Pattern對(duì)象

pattern = re.compile("正則表達(dá)式")

Pattern對(duì)象的屬性

  1. pattern: 編譯時(shí)用的表達(dá)式字符串
  2. flags: 編譯時(shí)用的匹配模式,數(shù)字形式
  3. groups: 表達(dá)式中分組的數(shù)量
  4. groupindex: 以表達(dá)式中有別名的組的別名為鍵咙轩、以該組對(duì)應(yīng)的編號(hào)為值的字典,沒(méi)有別名的組不包含在內(nèi)

Pattern對(duì)象的方法

1. match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

  1. 從第一個(gè)字符開(kāi)始匹配
  2. string是要匹配的字符串
  3. pos是起始匹配的位置
  4. endpos:終止匹配的位置
  5. 返回值是一個(gè)Match對(duì)象
match方法例子
import re
p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)

print("p.pattern:", p.pattern)
print("p.flags:", p.flags)
print("p.groups:", p.groups)
print("p.groupindex:", p.groupindex)

### output ###
# p.pattern: (\w+) (\w+)(?P<sign>.*)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}

2. search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

  1. 從字符整個(gè)字符串開(kāi)始搜索匹配
  2. string是要匹配的字符串
  3. pos是起始匹配的位置
  4. endpos:終止匹配的位置
  5. 返回值是一個(gè)Match對(duì)象
search方法例子
# encoding: UTF-8 
import re 

# 將正則表達(dá)式編譯成Pattern對(duì)象 
pattern = re.compile(r'world') 

# 使用search()查找匹配的子串殴泰,不存在能匹配的子串時(shí)將返回None 
# 這個(gè)例子中使用match()無(wú)法成功匹配 
match = pattern.search('hello world!') 

if match: 
    # 使用Match獲得分組信息
    print match.group()

### 輸出 ###
# world

3. split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])

  1. 從字符整個(gè)字符串開(kāi)始搜索匹配
  2. string:要匹配的字符串
  3. maxsplit:指定最大分割次數(shù)巧还,不指定將全部分割
  4. 返回值是一個(gè)分割的列表
split方法例子
import re

p = re.compile(r'\d+')
list1 = p.split('one1two2three3four4')
print(list1)
 
### output ###
# ['one', 'two', 'three', 'four', '']

4. findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

  1. 從開(kāi)頭到末尾匹配字符串
  2. string是要匹配的字符串
  3. pos是起始匹配的位置
  4. endpos:終止匹配的位置
  5. 返回一個(gè)找尋到的列表
findall方法例子
import re

p = re.compile(r'\d+')
list1 = p.findall('one1two2three3four4')
print(list1)

### output ###
# ['1', '2', '3', '4']

5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])

  1. 過(guò)濾出想要的數(shù)據(jù)穗泵,返回值是一個(gè)迭代器
finditer方法例子
import re

p =re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
    print m.group()
    
### output ###
# 1 2 3 4

6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])

  1. 利用repl字符串替換原有string字符串
  2. 第一個(gè)參數(shù)repl:要替換的字符串
  3. 第二個(gè)參數(shù)string:原始字符串
  4. 第三個(gè)參數(shù)count:count用于指定最多替換次數(shù),不指定時(shí)全部替換
  5. 返回值:返回一個(gè)字符串
sub方法例子
import re

p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'

print p.sub(r'\2 \1', s)

def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()

print p.sub(func, s)

### output ###
# say i, world hello!
# I Say, Hello World!

7. subn(repl, string[, count]) | re.sub(pattern, repl, string[, count])

  1. 利用repl字符串替換原有string字符串和上面的方法相比多一個(gè)返回次數(shù)
  2. 第一個(gè)參數(shù)repl:要替換的字符串
  3. 第二個(gè)參數(shù)string:原始字符串
  4. 第三個(gè)參數(shù)count:count用于指定最多替換次數(shù),不指定時(shí)全部替換
  5. 返回值是一個(gè)元組形式的:(找到的字符串,出現(xiàn)次數(shù))
subn方法例子
import re

p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'

p.subn(r'\2 \1', s)
print()

def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()

print p.subn(func, s)

### output ###
# ('say i, world hello!', 2)
# ('I Say, Hello World!', 2)

常見(jiàn)的正則表達(dá)式

QQ表達(dá)式

"[1-9]\\d{4,10}"

QQ號(hào)規(guī)則

  1. 首先扣扣號(hào)開(kāi)頭不能為0;
  2. QQ號(hào)必須大于5且小于11(或12,13,QQ號(hào)最長(zhǎng)位)

手機(jī)號(hào)表達(dá)式

# 平常手機(jī)號(hào)
"1[34578]\\d{9}"

# 手機(jī)號(hào)碼后5位相同
"1[34578]\\d{4}(\\d)\\1{4}"

手機(jī)號(hào)碼規(guī)則

  1. 手機(jī)號(hào)位數(shù)為11位
  2. 開(kāi)頭為1,第二位為3或4或5或7或8

郵箱表達(dá)式

"[a-zA-Z0-9_-]+\@(?:[a-zA-Z0-9_-]+\.)+[a-z]{2,4}"

郵箱規(guī)則

  1. @符號(hào)前面的可以為字母,數(shù)字,下劃線,中劃線,或'.'
  2. @后面的可以是xxx.com盗尸、xxx.cn柑船、xxx.com.cn

用戶名表達(dá)式

"[a-zA-z]\\w{0,9}"

用戶名規(guī)則

  1. 必須以字母開(kāi)頭,長(zhǎng)度在10位以內(nèi)

密碼表達(dá)式

".{6,16}"

密碼規(guī)則

  1. 任意字符泼各,6~16位
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞍时,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扣蜻,更是在濱河造成了極大的恐慌逆巍,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莽使,死亡現(xiàn)場(chǎng)離奇詭異锐极,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吮旅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)溪烤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)味咳,“玉大人庇勃,你說(shuō)我怎么就攤上這事〔凼唬” “怎么了责嚷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掂铐。 經(jīng)常有香客問(wèn)我罕拂,道長(zhǎng)揍异,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任爆班,我火速辦了婚禮衷掷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柿菩。我一直安慰自己戚嗅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布枢舶。 她就那樣靜靜地躺著懦胞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凉泄。 梳的紋絲不亂的頭發(fā)上躏尉,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音后众,去河邊找鬼胀糜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吼具,可吹牛的內(nèi)容都是我干的僚纷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拗盒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怖竭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起陡蝇,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痊臭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后登夫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體广匙,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年恼策,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸦致。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涣楷,死狀恐怖分唾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狮斗,我是刑警寧澤绽乔,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碳褒,受9級(jí)特大地震影響折砸,放射性物質(zhì)發(fā)生泄漏看疗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一睦授、第九天 我趴在偏房一處隱蔽的房頂上張望两芳。 院中可真熱鬧,春花似錦去枷、人聲如沸盗扇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疗隶。三九已至,卻和暖如春翼闹,著一層夾襖步出監(jiān)牢的瞬間斑鼻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工猎荠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坚弱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓关摇,卻偏偏與公主長(zhǎng)得像荒叶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子输虱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • re模塊手冊(cè) 本模塊提供了和Perl里的正則表達(dá)式類似的功能些楣,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,010評(píng)論 0 13
  • 本文介紹了Python對(duì)于正則表達(dá)式的支持宪睹,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫(kù)的完整介紹及使用示例...
    Python程序媛閱讀 1,351評(píng)論 0 22
  • 在前面我們已經(jīng)搞定了怎樣獲取頁(yè)面的內(nèi)容愁茁,不過(guò)還差一步,這么多雜亂的代碼夾雜文字我們?cè)鯓影阉崛〕鰜?lái)整理呢亭病?下面就開(kāi)...
    知曰閱讀 4,210評(píng)論 1 15
  • 說(shuō)明 摘抄為主鹅很,忘記是在什么地方看見(jiàn)的原文了。原作者別打我罪帖,若你見(jiàn)了請(qǐng)聯(lián)系我促煮,增加你的版權(quán)和鏈接描述 整體過(guò)程 P...
    明慢慢閱讀 1,017評(píng)論 0 8
  • 我是會(huì)花錢買五月天數(shù)字專輯的路人粉 《自傳》里最喜歡《你說(shuō)那C和弦是》這一首 也是易烊千璽的路人粉 把他不知道為哪...
    Chattin閱讀 596評(píng)論 0 0