學習過程筆記【181-184】正則表達式 <特殊字符><函數>

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.

相關文章
相關標籤/搜索