[Python] (Day-19) - 正則表達式

My life is in these books. Read these and know my heart. 我的人生就在這些書中砂碉,讀完他們就能讀懂我的心。

正則表達式是一個特殊的字符序列夹厌,它能幫助你方便的檢查一個字符串是否與某種模式匹配

re 模塊使 Python 語言擁有全部的正則表達式功能


re.match 函數(shù)

re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none

函數(shù)語法:

re.match(pattern, string, flags=0)

函數(shù)參數(shù)說明:

  • pattern : 匹配的正則表達式
  • string : 要匹配的字符串
  • flags : 標(biāo)志位,用于控制正則表達式的匹配方式堕仔,如:是否區(qū)分大小寫,多行匹配等等

匹配成功re.match方法返回一個匹配的對象晌区,否則返回None

我們可以使用group(num)groups() 匹配對象函數(shù)來獲取匹配表達式

匹配對象方法

  • group(num=0): 匹配的整個表達式的字符串摩骨,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應(yīng)值的元組
  • groups() : 返回一個包含所有小組字符串的元組朗若,從 1 到 所含的小組號

實例 1:

import re
print(re.match('http', 'http://imazy.cn').span())  # 在起始位置匹配
print(re.match('cn', 'http://imazy.cn'))           # 不在起始位置匹配

實例運行輸出結(jié)果為:

(0, 4)
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!!")

實例運行輸出結(jié)果為:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search方法

re.search 掃描整個字符串并返回第一個成功的匹配

函數(shù)語法:
re.search(pattern, string, flags=0)

函數(shù)參數(shù)說明:

  • pattern: 匹配的正則表達式
  • string: 要匹配的字符串
  • flags : 標(biāo)志位恼五,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫哭懈,多行匹配等等

匹配成功re.search方法返回一個匹配的對象灾馒,否則返回None

我們可以使用group(num)groups() 匹配對象函數(shù)來獲取匹配表達式, 具體說明和上面一樣

實例 1:

import re
print(re.search('http', 'http://imazy.cn').span())  # 在起始位置匹配
print(re.search('cn', 'http://imazy.cn'))           # 不在起始位置匹配

實例運行輸出結(jié)果為:

(0, 4)
(13, 15)

實例 2:

import re

line = "Cats are smarter than dogs"

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("No searched!")

實例運行輸出結(jié)果為:

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match與re.search的區(qū)別

re.match只匹配字符串的開始,如果字符串開始不符合正則表達式遣总,則匹配失敗睬罗,函數(shù)返回None;而re.search匹配整個字符串旭斥,直到找到一個匹配


檢索和替換

re模塊提供了re.sub用于替換字符串中的匹配項容达。

語法:

re.sub(pattern, repl, string, count=0)

參數(shù):

  • pattern: 正則中的模式字符串垂券。
  • repl : 替換的字符串,也可為一個函數(shù)菇爪。
  • string : 要被查找替換的原始字符串。
  • count: 模式匹配后替換的最大次數(shù)凳宙,默認 0 表示替換所有的匹配。

實例:

import re

phone = "010-8888-6666 # 這是一個電話號碼"

# 刪除注釋
num = re.sub(r'#.*$', "", phone)
print ("電話號碼 : ", num)

# 移除非數(shù)字的內(nèi)容
num = re.sub(r'\D', "", phone)
print ("電話號碼 : ", num)

實例執(zhí)行結(jié)果如下:

電話號碼 :  010-8888-6666 
電話號碼 :  01088886666 
repl 參數(shù)是一個函數(shù)
import re

# 將匹配的數(shù)字乘于 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

輸出結(jié)果為:

A46G8HFD1134

正則表達式修飾符 - 可選標(biāo)志

正則表達式可以包含一些可選標(biāo)志修飾符來控制匹配的模式。
修飾符被指定為一個可選的標(biāo)志堪旧。
多個標(biāo)志可以通過按位 OR(|) 它們來指定。

re.I | re.M 被設(shè)置成 IM標(biāo)志:

修飾符 描述
re.I 使匹配對大小寫不敏感
re.L 做本地化識別(locale-aware)匹配
re.M 多行匹配淳梦,影響 ^ 和 $
re.S 使 . 匹配包括換行在內(nèi)的所有字符
re.U 根據(jù)Unicode字符集解析字符。這個標(biāo)志影響 \w, \W, \b, \B.
re.X 該標(biāo)志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解爆袍。

正則表達式模式

模式字符串使用特殊的語法來表示一個正則表達式:
  • 字母和數(shù)字表示他們自身作郭。一個正則表達式模式中的字母和數(shù)字匹配同樣的字符串

  • 多數(shù)字母和數(shù)字前加一個反斜杠時會擁有不同的含義

  • 標(biāo)點符號只有被轉(zhuǎn)義時才匹配自身弦疮,否則它們表示特殊的含義

  • 反斜杠本身需要使用反斜杠轉(zhuǎn)義

  • 由于正則表達式通常都包含反斜杠,所以你最好使用原始字符串來表示它們胁塞。模式元素(如 r'/t',等價于'//t')匹配相應(yīng)的特殊字符

正則表達式模式語法中的特殊元素

模式 描述
^ 匹配字符串的開頭
$ 匹配字符串的末尾啸罢。
. 匹配任意字符,除了換行符扰才,當(dāng)re.DOTALL標(biāo)記被指定時允懂,則可以匹配包括換行符的任意字符。
[...] 用來表示一組字符,單獨列出:[amk] 匹配 'a'衩匣,'m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符蕾总。
re* 匹配0個或多個的表達式。
re+ 匹配1個或多個的表達式舵揭。
re? 匹配0個或1個由前面的正則表達式定義的片段谤专,非貪婪方式
re{ n,} 精確匹配n個前面表達式。
re{ n, m} 匹配 n 到 m 次由前面的正則表達式定義的片段午绳,貪婪方式
a| b 匹配a或b
(re) G匹配括號內(nèi)的表達式置侍,也表示一個組
(?imx) 正則表達式包含三種可選標(biāo)志:i, m, 或 x 。只影響括號中的區(qū)域拦焚。
(?-imx) 正則表達式關(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āng)前位置成功匹配時成功僵刮,否則失敗据忘。但一旦所含表達式已經(jīng)嘗試,匹配引擎根本沒有提高搞糕;模式的剩余部分還要嘗試界定符的右邊勇吊。
(?! re) 前向否定界定符。與肯定界定符相反窍仰;當(dāng)所含表達式不能在字符串當(dāng)前位置匹配時成功
(?> re) 匹配的獨立模式汉规,省去回溯。
\w 匹配字母數(shù)字
\W 匹配非字母數(shù)字
\s 匹配任意空白字符驹吮,等價于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意數(shù)字针史,等價于 [0-9].
\D 匹配字符串開始
\Z 匹配字符串結(jié)束晶伦,如果是存在換行,只匹配到換行前的結(jié)束字符串啄枕。c
\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)匹配辐怕。否則指的是八進制字符碼的表達式寄疏。

正則表達式實例

實例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括號內(nèi)的任意一個字母
[0-9] 匹配任何數(shù)字陕截。類似于 [0123456789]
[a-z] 匹配任何小寫字母
[A-Z] 匹配任何大寫字母
[a-zA-Z0-9] 匹配任何字母及數(shù)字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了數(shù)字外的字符

字符類

實例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括號內(nèi)的任意一個字母
[0-9] 匹配任何數(shù)字艘策。類似于 [0123456789]
[a-z] 匹配任何小寫字母
[A-Z] 匹配任何大寫字母
[a-zA-Z0-9] 匹配任何字母及數(shù)字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了數(shù)字外的字符

特殊字符類

實例 描述
. 匹配除 "\n" 之外的任何單個字符渊季。要匹配包括 '\n' 在內(nèi)的任何字符罚渐,請使用象 '[.\n]' 的模式
\d 匹配一個數(shù)字字符荷并。等價于 [0-9]
\D 匹配一個非數(shù)字字符源织。等價于 [^0-9]
\s 匹配任何空白字符微猖,包括空格凛剥、制表符、換頁符等等逻炊。等價于 [ \f\n\r\t\v]
\S 匹配任何非空白字符犁享。等價于 [^ \f\n\r\t\v]
\w 匹配包括下劃線的任何單詞字符炊昆。等價于'[A-Za-z0-9_]'
\W 匹配任何非單詞字符窑眯。等價于 '[^A-Za-z0-9_]'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磅甩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渣聚,更是在濱河造成了極大的恐慌僧叉,老刑警劉巖瓶堕,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谭梗,死亡現(xiàn)場離奇詭異,居然都是意外死亡激捏,警方通過查閱死者的電腦和手機远舅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門序六,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚤吹,“玉大人,你說我怎么就攤上這事余佃”粒” “怎么了步势?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵坏瘩,是天一觀的道長倔矾。 經(jīng)常有香客問我,道長哪自,這世上最難降的妖魔是什么壤巷? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任胧华,我火速辦了婚禮,結(jié)果婚禮上矩动,老公的妹妹穿的比我還像新娘铅忿。我一直安慰自己檀训,他們只是感情好享言,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布览露。 她就那樣靜靜地躺著差牛,像睡著了一般偏化。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驶冒,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天骗污,我揣著相機與錄音需忿,去河邊找鬼贴谎。 笑死擅这,一個胖子當(dāng)著我的面吹牛仲翎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溯香,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼结笨,長吁一口氣:“原來是場噩夢啊……” “哼湿镀!你這毒婦竟也來了勉痴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤瀑罗,失蹤者是張志新(化名)和其女友劉穎雏掠,沒想到半個月后乡话,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年颅停,在試婚紗的時候發(fā)現(xiàn)自己被綠了癞揉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喊熟。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡姐刁,死狀恐怖芥牌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聂使,我是刑警寧澤壁拉,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布谬俄,位于F島的核電站,受9級特大地震影響弃理,放射性物質(zhì)發(fā)生泄漏溃论。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一痘昌、第九天 我趴在偏房一處隱蔽的房頂上張望钥勋。 院中可真熱鬧,春花似錦辆苔、人聲如沸姑子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春粮呢,著一層夾襖步出監(jiān)牢的瞬間哩照,已是汗流浹背姻乓。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工剪个, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓溃蔫,卻偏偏與公主長得像私痹,于是被迫代替她去往敵國和親侥蒙。 傳聞我的和親對象是個殘疾皇子桦山,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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

  • re模塊手冊 本模塊提供了和Perl里的正則表達式類似的功能,不關(guān)是正則表達式本身還是被搜索的字符串矢沿,都可以...
    喜歡吃栗子閱讀 3,990評論 0 13
  • 初衷:看了很多視頻栽惶、文章汁蝶,最后卻通通忘記了,別人的知識依舊是別人的只锻,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 3,993評論 0 20
  • 今天中午午餐的湯是海鮮湯乡洼。于是有了以下對話: "我們今天去海邊了??" "是啊束昵,這里都是海水"(指著碗里的湯說) ...
    冉小鹿閱讀 694評論 2 2
  • 今天是世界讀書日轻绞。清早起來泡好茶稼病,看到高中班級微信群里面十分鬧熱,幾個同學(xué)在里面大談鸚鵡褐墅。這個話題源于我昨晚分享了...
    陳子弘閱讀 979評論 0 2
  • 一直想好好再寫一篇關(guān)于歡樂英雄的讀后感持际,一直沒能成筆蜘欲,醞釀還不夠,笨拙的語言還不能描述我對王動和郭大路的喜愛晌柬,我還...
    燕來小記閱讀 1,283評論 0 2