1.頭文件python
import re正則表達式
2.re.findall("stra","strb",匹配模式) 在strb中找stra,返回一個列表,列表中爲全部的匹配內容shell
>>> re.findall("juruo","iamjuruoiamnotjuruo") ['juruo', 'juruo']
>>> re.findall("juruo","iamyzw") []
>>> re.search("ab","cdabcd") <_sre.SRE_Match object; span=(2, 4), match='ab'> >>> re.search("ab","cdabcd").group() 'ab'
2re.search("stra","strb",匹配模式) 匹配一次,返回一個search對象spa
>>> re.search("ab+","abab") <_sre.SRE_Match object; span=(0, 2), match='ab'>
3re.match("strb","stra",[匹配模式]) 匹配一次,且只對開頭進行匹配,返回一個match對象code
>>> re.match("abc","abcde") <_sre.SRE_Match object; span=(0, 3), match='abc'> >>> re.match("bcd","abcd") #匹配不成功返回空
search match findall的匹配模式:對象
re.I 不區分大小寫blog
>>> re.search("AB","12ab",re.I).group() 'ab'
>>> re.match("abc","ABC",re.I).group() 'ABC'
>>> re.findall("ab","abAB",re.I) ['ab', 'AB']
re.S 使.匹配包括換行符在內的全部字符字符串
>>> re.search(".","\n",re.S).group() '\n'
>>> re.match("abc.","abc\n").group() Traceback (most recent call last): File "<pyshell#75>", line 1, in <module> re.match("abc.","abc\n").group() AttributeError: 'NoneType' object has no attribute 'group' (報錯) >>> re.match("abc.","abc\n",re.S).group() 'abc\n'
>>> re.findall(".","abc\n",re.S) ['a', 'b', 'c', '\n']
4.get
rearch,match對象的方法
group(【參數】) 返回匹配的字符串
start() 返回匹配開始的位置
end() 返回匹配結束的位置
span() 返回一個元組包含匹配(開始,結束)的位置
groups() 舉個栗子說明
>>> re.search("a","bac").group() 'a' >>> re.search("a","bac").start()#左閉 1 >>> re.search("a","bac").end() #右開 2 >>> re.search("a","bac").span() #左閉右開 (1, 2)
>>> re.match("a","abc").group() 'a' >>> re.match("a","abc").start() #左閉 0 >>> re.match("a","abc").end() #右開 1 >>> re.match("a","abc").span() #左閉右開 (0, 1)
group()it
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group() #默認爲0 '12abcABCD' >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(0) #全部匹配的內容 '12abcABCD' >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1) #返回其中第一組匹配的內容 '12' >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(2) #返回其中第二組匹配的內容 'abc' >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(3) #返回其中第三組匹配的內容 'ABCD'
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1,2) #返回其中第一二組匹配的內容 ('12', 'abc') >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1,2,3) #返回其中第一二三組匹配的內容 ('12', 'abc', 'ABCD') >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(2,3) #返回其中第二三組匹配的內容 ('abc', 'ABCD')
5 sub() 替換 re.sub("舊的","新的","str",[次數]) 次數能夠省略,不寫時表示替換全部
>>> re.sub("g.t","have","I get A ,I got B, I gut C") 'I have A ,I have B, I have C' >>> re.sub("g.t","have","I get A ,I got B, I gut C",1) 'I have A ,I got B, I gut C' >>> re.sub("g.t","have","I get A ,I got B, I gut C",2) 'I have A ,I have B, I gut C' >>> re.sub("g.t","have","I get A ,I got B, I gut C",3) 'I have A ,I have B, I have C'
6.subn 替換,並返回替換的次數 re.sub("舊的","新的","str",[次數]) 不寫次數表示替換全部
>>> re.subn("juruo","yzw","I am juruo.My QQname is juruo,My csdn naame is juruo") ('I am yzw.My QQname is yzw,My csdn naame is yzw', 3) >>> re.subn("juruo","yzw","I am juruo.My QQname is juruo,My csdn naame is juruo",2) ('I am yzw.My QQname is yzw,My csdn naame is juruo', 2)
7.compile 把正則表達式規(stra)則編成一個對象,這樣能夠重複利用 re.compile("正則表達式規則")
>>> a=re.compile("b.c") >>> re.findall(a,"bac") ['bac'] >>> a.findall("bac") #也能夠用生成的對象來調用finall方法,實際上a是在re上封裝了這個規則..因此能夠用findall ['bac']
8.split分割 splirt("規則","str")
' >>> re.split("\\d+","ab1ab2ab") ['ab', 'ab', 'ab'] >>> a=re.compile("\\d+") #將正則表達式規則封裝成對象a >>> re.split(a,"ab1ab2ab") #使用對象a做爲規則 ['ab', 'ab', 'ab'] >>> a.split("ab1ab2ab") #a其實是在re中封裝規則獲得的,因此能夠使用split ['ab', 'ab', 'ab']
>>> re.split("[ab]","cacbc") ['c', 'c', 'c']
5.二元字符 (11個)
. ^ $ * + ? {} [] | () \
【.】通配符 匹配一個除了換行符外的任何字符
【^】 re.finadall("^stra","strb")若是stra在strb的開頭位置,則匹配成功
例子:
>>> re.findall("^123","123456") ['123'] >>> re.findall("^123","4123") []
【$】 re.findall("stra$",strb"") 若是stra在strb的末尾則匹配成功
例子:
>>> re.findall("456$","123456") ['456']
【* 】重複零到屢次 (這是一種貪婪匹配)
>>> re.findall("abc*","abc") ['abc'] >>> re.findall("abc*","abcccccc") #貪婪匹配:它會匹配c最多的那個 ['abcccccc']
【+】 重複1到屢次
>>> re.findall("ax+","axxxx") ['axxxx']
【?】 重複0次或1次
>>> re.findall("ax?","a") ['a'] >>> re.findall("ax?","ax") ['ax'] >>> re.findall("ax?","axx") ['ax']
【{}】重複指定次數 {x}重複x次 {a,b} 匹配[a,b]次(閉區間)
>>> re.findall("ax{3}","axxxxxx") ['axxx']
>>> re.findall("ax{0,3}","aaxaxxaxxx") ['a', 'ax', 'axx', 'axxx']
【\】
\後面跟元字符(正則表達式特殊字符),會去除它們的特殊功能
\\引用序號對應字組所匹配的字符串
>>> re.search("(abc)(def)\\1","abcdefabc").group() #這裏(abc)是第1組 d(ef)是第2組 'abcdefabc' >>> re.search("(abc)(def)\\2","abcdefdef").group() 'abcdefdef'
\d 匹配【0,9】閉區間
\D 匹配任何非數字字符 至關於[^0-9]
\s匹配任何空白字符 至關於:\n \t 空格 \r \f \v
\S匹配任何非空白字符
\w匹配任何字母數字字符 至關於【a-z】並【A-Z】並【0-9】
\W匹配任何非字母數字字符
\b匹配一個單詞的邊界,實際上是匹配字符和空格之間的位置
就是在你匹配單個單詞的時候,若是不是單個單詞就不匹配
例如:匹配I的時候有不少單詞中都有I 但我指向匹配單個I
>>> re.search("\\bI\\b","IBIc I ").group() 'I'
【[]】 其中的一個字符 [abcdef]匹配其中的一個字符 re.findall("[stra]","strb") 一個一個字符的遍歷字符串strb,而後和stra的字符進行匹配
>>> re.findall("[abcdef]haha","ahaha") ['ahaha'] >>> re.findall("[abcdef]haha","abhaha") ['bhaha']
[]中的(元字符)特殊字符所有變成普通字符
>>> re.findall("a[.]b","aab") [] #沒有起到通配符的做用 >>> re.findall("a[.]b","a.b") #和.匹配 ['a.b']
[]中-起到至的做用
>>> re.findall("[a-z]","abcdefg")#一個一個字符遍歷"abcdefg"進行匹配
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> re.findall("[0-9]","0123456789")
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
[]中^起到非的做用 [^1-9]除了1到9的數字都被匹配
>>> re.findall("[^1-9]","12345abc") ['a', 'b', 'c']
【()】做爲一個總體進行處理
【|】或
6.非貪婪
從前面看 ? + *都是貪婪匹配
首先看貪婪模式
>>> re.search("a\d+","a23b") <_sre.SRE_Match object; span=(0, 3), match='a23'> >>> re.search("a\d+","a23b").group() 'a23' >>> re.search("a\d+","a2312345").group() 'a2312345'
非貪婪模式
>>> re.search("a\d+?","a2312345").group() 'a2' >>> re.search("a\d*?","a2312345").group() 'a'
注意有這種特殊狀況:
須要費貪婪匹配的東西夾在中間是不行的,會匹配全部的
>>> re.search("a(\d+?)b","a23b").group() 'a23b'
7.