Python基礎(chǔ)教程之正則表達(dá)式基本語(yǔ)法以及re模塊
什么是正則:
正則表達(dá)式是可以匹配文本片段的模式。
正則表達(dá)式'Python'可以匹配'python'
正則是個(gè)很牛逼的東西,python中當(dāng)然也不會(huì)缺少。
所以今天的Python就跟大家一起討論一下python中的re模塊。
re模塊包含對(duì)正則表達(dá)式的支持。
通配符
.表示匹配任何字符:
‘.ython'可以匹配'python'和'fython'
對(duì)特殊字符進(jìn)行轉(zhuǎn)義:
‘python\.org'匹配‘python.org'
字符集
‘[pj]ython'能夠匹配'python'和'jython'
反轉(zhuǎn)字符集
‘[^abc]'可以匹配除了abc之外的任何字符
選擇符
使用管道符號(hào)|
可選項(xiàng)
加上問(wèn)好就變?yōu)榱丝蛇x項(xiàng):
r'(http://)?(www.)?python.org‘只能匹配下面幾種:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
重復(fù)子模式
*:允許模式重復(fù)0次或多次
+:允許模式重復(fù)1次或多次
{m, n}允許模式重復(fù)m-n次
當(dāng)然,正則語(yǔ)法規(guī)則很多,遠(yuǎn)不止上面的這些。但是我們只能點(diǎn)到為止了,因?yàn)檫@篇博客的目的是介紹Python中的模塊,re模塊。
re 模塊使 Python 語(yǔ)言擁有全部的正則表達(dá)式功能。
compile 函數(shù)根據(jù)一個(gè)模式字符串和可選的標(biāo)志參數(shù)生成一個(gè)正則表達(dá)式對(duì)象。該對(duì)象擁有一系列方法用于正則表達(dá)式匹配和替換。
re 模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個(gè)模式字符串做為它們的第一個(gè)參數(shù)。
re中重要的函數(shù):
compile(pattern[, flags]) 根據(jù)包含正則表達(dá)式的字符串創(chuàng)建模式對(duì)象
search(pattern, string[, flags]) 在字符串中尋找模式
match(pattern, string[, flags]) 在字符串的開(kāi)始處匹配模式
split(pattern, string[, maxsplit=0]) 根據(jù)匹配項(xiàng)分割字符串
findall(pattern, string) 列出字符串中模式的所有匹配項(xiàng)
sub(pat, rep, string[, count=0]) 字符串中所有pat的匹配項(xiàng)用repl替換
escape(string) 將字符串中所有特殊表達(dá)式字符轉(zhuǎn)義
下面就進(jìn)行簡(jiǎn)單的應(yīng)用:
使用match
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
使用search
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
這時(shí)候需要停一下,match和search的區(qū)別呢?
看看結(jié)果先:
match例子中結(jié)果:
(0, 3)
None
search例子中結(jié)果:
(0, 3)
(11, 14)
match()函數(shù)只檢測(cè)RE是不是在string的開(kāi)始位置匹配,search()會(huì)掃描整個(gè)string查找匹配;
也就是說(shuō)match()只有在0位置匹配成功的話(huà)才有返回,如果不是開(kāi)始位置匹配成功的話(huà),match()就返回none。
search()會(huì)掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
使用sub
Python 的re模塊提供了re.sub用于替換字符串中的匹配項(xiàng)。
#!/usr/bin/python import re phone = "2004-959-559 # This is Phone Number" # Delete Python-style comments num = re.sub(r'#.*$', "", phone) print "Phone Num : ", num # Remove anything other than digits num = re.sub(r'\D', "", phone) print "Phone Num : ", num
結(jié)果:
Phone Num : 2004-959-559
Phone Num : 2004959559
最后獻(xiàn)上菊花:
^ 匹配字符串的開(kāi)頭
$ 匹配字符串的末尾。
. 匹配任意字符,除了換行符,當(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}
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) 類(lèi)似 (...), 但是不表示一個(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 匹配字符串開(kāi)始
\Z 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串。c
\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è)分組的子表達(dá)式。
\10 匹配第n個(gè)分組的子表達(dá)式,如果它經(jīng)匹配。否則指的是八進(jìn)制字符碼的表達(dá)式。
re的正則表達(dá)式語(yǔ)法
正則表達(dá)式語(yǔ)法表如下:
| 語(yǔ)法 | 意義 | 說(shuō)明 |
| "." | 任意字符 | |
| "^" | 字符串開(kāi)始 | '^hello'匹配'helloworld'而不匹配'aaaahellobbb' |
| "$" | 字符串結(jié)尾 | 與上同理 |
| "*" |
0 個(gè)或多個(gè)字符(貪婪匹配) |
<*>匹配 |
| "+" |
1 個(gè)或多個(gè)字符(貪婪匹配) |
與上同理 |
| "?" |
0 個(gè)或多個(gè)字符(貪婪匹配) |
與上同理 |
| *?,+?,?? |
以上三個(gè)取第一個(gè)匹配結(jié)果(非貪婪匹配) | <*>匹配 |
相關(guān)文章
在服務(wù)器端實(shí)現(xiàn)無(wú)間斷部署Python應(yīng)用的教程
這篇文章主要介紹了在服務(wù)器端實(shí)現(xiàn)無(wú)間斷部署Python應(yīng)用的教程,方法主要是Gunicorn進(jìn)行重載,需要的朋友可以參考下2015-04-04
python opencv 讀取本地視頻文件 修改ffmpeg的方法
今天小編就為大家分享一篇python opencv 讀取本地視頻文件 修改ffmpeg的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
快速進(jìn)修Python指南之函數(shù)進(jìn)階
這篇文章主要為大家介紹了Java開(kāi)發(fā)者快速進(jìn)修Python指南之函數(shù)進(jìn)階示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Python上下文管理器實(shí)現(xiàn)方法總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Python上下文管理器實(shí)現(xiàn)方法總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-07-07
Python pandas遍歷行數(shù)據(jù)的2種方法小結(jié)
pandas在數(shù)據(jù)處理過(guò)程中,除了對(duì)整列字段進(jìn)行處理之外,有時(shí)還需求對(duì)每一行進(jìn)行遍歷,本文就來(lái)介紹Python pandas遍歷行數(shù)據(jù)的2種方法小結(jié),感興趣的可以了解一下2024-03-03

