原子是正則表達式中最基本的組成單位,每一個正則表達式中至少要包含一個原子
常見的原子有這幾類:普通字符做爲原子、非打印字符做爲原子、通用字符做爲原子和原子表php
#普通字符做爲原子 import re pattern = "yue"#yue做爲原子使用,有三個原子,分別是y,u,e string = "http://yum.iqianyue.com" resultl = re.search(pattern,string)#在string中匹配正確的正則表達式,若匹配成功,將匹配結果返回給變量result print(resultl)
<_sre.SRE_Match object; span=(16, 19), match='yue'>
##非打印字符做爲原子 import re pattern = "\n" string = '''http://yum.iqianyue.com http://baidu.com''' #字符串變量string中包含一個多行的數據,因此這個數據裏面包含了對應的換行符,因此,此時進行換行符匹配 resultl = re.search(pattern,string) print(resultl)
<_sre.SRE_Match object; span=(23, 24), match='\n'>
import re pattern = "\n" string = '''http://yum.iqianyue.comhttp://baidu.com'''#在字符串中不包含換行,因此沒法成功匹配,故最後輸出None resultl = re.search(pattern,string) print(resultl)
None
符號 | 含義 |
---|---|
\w |
匹配任意一個字母、數字和下劃線 |
\W |
匹配除任意一個字母、數字和下劃線之外的任意一個字符 |
\d |
匹配任意一個十進制數 |
\D |
匹配除十進制數之外的任意一個其餘字符 |
\s |
匹配任意一個空白字符 |
\S |
匹配除空白字符之外的任意一個其餘字符 |
#通用字符做爲原子示例 import re pattern = "\w\dpython\w"#'\w'匹配任意一個字母、數字、下劃線;'\d'匹配任意一個十進制數; string = "abcdfphp345pythony_py" result1 = re.search(pattern,string) print(result1)
<_sre.SRE_Match object; span=(9, 18), match='45pythony'>
#原子表示例 import re pattern1 = "\w\dpython[xyz]\w" pattern2 = "\w\python[^xyz]\w" pattern3 ="\w\dpython[xyz]\W" string = "abcdfphp345pythony_py" result1 = re.search(pattern1,string) result2= re.search(pattern2,string) result3 = re.search(pattern3,string) print(result1) print(result2) print(result3)
<_sre.SRE_Match object; span=(9, 19), match='45pythony_'> None None
符號 | 含義 |
---|---|
. |
匹配除換行符之外的任意字符 |
^ |
匹配字符串的開始位置 |
$ |
匹配字符串的終止位置 |
* |
匹配0次、1次或屢次前面的原子 |
? |
匹配0次或1次前面的原子 |
+ |
匹配1次或屢次前面的原子 |
{n} |
前面的原子正好出現n次 |
{n,} |
前面的原子至少出現n次 |
{m,n} |
前面的原子至少出現n次,至多出現m次 |
首先看任意匹配符‘.’,能夠用‘.’匹配一個除換行符之外的任意字符。
好比,用正則表達式「.python...」匹配一個「python」字符前面有1位,後面有3位格式的字符,這前面的1位和後面的3位能夠是除了換行符意外的任意字符。如如下程序:python
import re pattern=".python..." string = "abcdfphp345pythony_py" result1 = re.search(pattern1,string) print(result1)
<_sre.SRE_Match object; span=(9, 19), match='45pythony_'>
可使用「^」匹配字符串的開始,使用「$」匹配字符串的結束,以下例:正則表達式
import re pattern1 = "^abd"#限制以abd開始 pattern2 = "^abc"#限制以abc開始 pattern3 ="py$"#限制以py結束 pattern4 = "ay$"#限制以ay結束 string = "abcdfphp345pythony_py"#源字符串 result1 = re.search(pattern1,string) result2= re.search(pattern2,string) result3 = re.search(pattern3,string) result4 = re.search(pattern4,string) print(result1) print(result2) print(result3) print(result4)
None <_sre.SRE_Match object; span=(0, 3), match='abc'> <_sre.SRE_Match object; span=(19, 21), match='py'> None
限定符也是元子符中的一種,常見的限定符包括*、?、+、{n}、{n,}、{n,m}函數
import re pattern1 = "py.*n" pattern2 = "cd{2}" pattern3 ="cd{3}" pattern4 = "cd{2, }" string = "abcdddfphp345pythony_py" result1 = re.search(pattern1,string) result2= re.search(pattern2,string) result3 = re.search(pattern3,string) result4 = re.search(pattern4,string) print(result1) print(result2) print(result3) print(result4)
<_sre.SRE_Match object; span=(13, 19), match='python'> <_sre.SRE_Match object; span=(2, 5), match='cdd'> <_sre.SRE_Match object; span=(2, 6), match='cddd'> None
來看模式選擇符「|」,使用模式選擇符,能夠設置多個模式,匹配時可從中選擇任意一個模式匹配。好比正則表達式「python|php」中,字符串「python」和「php」均知足匹配條件spa
#模式匹配符示例 import re pattern = "python|php" string ="abcdfphp345pythony_py" result = re.search(pattern,string) print(result) #能夠看出,從源字符串中匹配到告終果「php」
<_sre.SRE_Match object; span=(5, 8), match='php'>
符號 | 含義 |
---|---|
I |
匹配時忽略大小寫 |
M |
多行匹配 |
L |
作本地化識別匹配 |
U |
根據Unicode字及解析字符 |
S |
讓.匹配包括換行符,即用了該模式修正後,「.」匹配就能夠匹配任意的字符了 |
import re pattern1 = "python" pattern2 = "python" string = "abcdfphp345Pythony_py" result1 = re.search(pattern1,string) result2= re.search(pattern2,string,re.I)#忽略大小寫 print(result1) print(result2)
None <_sre.SRE_Match object; span=(11, 17), match='Python'>
import re pattern = "\t" string = '''http://yum.iqianyue.com http://baidu.com''' resultl = re.search(pattern,string) print(resultl)
None
總的來講,貪婪模式就是的核心就是儘量多的匹配,而懶惰模式就是儘量少的匹配。
可看下面的示例:code
import re pattern1 = "p.*y"#貪婪模式 pattern2 = "p.*? y"#懶惰模式 string = "abcdfphp345pythony_py" result1= re.search(pattern1,string) result2=re.search(pattern2,string) print(result1)#找到結尾字符y才中止,即找到最後一個y字符才中止 print(result2)#一旦找到了字符y就中止
<_sre.SRE_Match object; span=(5, 21), match='php345pythony_py'> None
常見的表達式函數有:re.match()函數、re.search()函數、全局匹配函數、re.sub()函數.字符串
從源字符的起始位置匹配一個模式,就用re.match()函數,其格式爲:re.match(pattern,string,flag),第一個參數表示對應的正則表達式,第二個表示源字符,第三個是可選參數,表示對應的標誌位,能夠放模式修正等信息.string
import re pattern = ".python" string = "apythonhellomypythonhispythonourpythononend" result1=re.match(pattern,string) result2 = re.match(pattern,string).span()#經過.span()能夠過濾掉一些信息,只留下匹配成功的結果在源字符串中的位置 print(result1) print(result2)
<_sre.SRE_Match object; span=(0, 7), match='apython'> (0, 7)
用該函數進行匹配,會掃描整個源字符串並進行對應的匹配。
與re.match()函數的不一樣之處,該函數在全文中進行檢索匹配,而re.match()函數是從源字符串的開頭進行匹配。編譯
import re pattern = ".python" string = "hellomypythonhispythonourpythononend" result1=re.match(pattern,string) result2 = re.search(pattern,string) print(result1) print(result2)
None <_sre.SRE_Match object; span=(6, 13), match='ypython'>
import re string = "hellomypythonhispythonourpythonend" pattern =re.compile(".python.")#預編譯 result =pattern.findall(string)#找出全部符合模式的結果 print(result)
['ypythonh', 'spythono', 'rpythone']
#對上式的整合 import re string = "hellomypythonhispythonourpythonend" pattern = ".python." result =re.compile(pattern).findall(string) print(result)
['ypythonh', 'spythono', 'rpythone']
根據正則表達式實現替換某些字符串的功能,可使用re.sub()函數實現,其格式爲:re.sub(pattern,rep,string,max), 第一個參數表示對應的正則表達式,第二個參數表示要替換成的字符串,第三個參數表示爲源字符串,第四個表示可選項,表明最多替換的次數,若忽略不寫的話,會將符合模式的結果所有替換table
import re string = "hellomypythonhispythonourpythonend" pattern = "python." result = re.sub(pattern,"php",string) result2=re.sub(pattern,"php",string,) print(result1) print(result2)
<_sre.SRE_Match object; span=(5, 19), match='php345pytho_py'> hellomyphpisphpurphpnd