python與Regex

來源:互聯網
上載者:User

標籤:替換   back   分組   order   .com   參數   顯示   查詢   arch   

1.Regex

  正則,只跟字串相關,就是匹配字串內容的一種規則。

  正則主要有兩部分組成,要尋找字元的類型,以及要尋找字元的數量。(自己的理解)

  字元的類型:(相當於你要找的部分內容)

  

元字元
 
匹配內容
匹配除分行符號以外的任一字元
\w 匹配字母或數字或底線
\s 匹配任意的空白符
\d 匹配數字
\n 匹配一個分行符號
\t 匹配一個定位字元
\b 匹配一個單詞的結尾
^ 匹配字串的開始
$ 匹配字串的結尾
\W
匹配非字母或數字或底線
\D
匹配非數字
\S
匹配非空白符
a|b
匹配字元a或字元b
()
匹配括弧內的運算式,也表示一個組
[...]
匹配字元組中的字元
[^...]
匹配除了字元組中字元的所有字元

 

  代表數量的量詞:(相當於你要找的部分內容對應的個數)

    

量詞
用法說明
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次

 

 

  樣本:

  ‘d\d+\w{3,6}p‘   這個Regex代表的是:以d開頭,後邊是數字,數量是1個或者多個,後邊是字母、數字、底線,數量是3-6個,然後以一個p結尾。

  備忘:這裡都是預設為貪婪模式,數量能找到滿足條件的多個,就找多個,非貪婪模式的是在表達數位後邊加‘?’號。如右:‘d\d+?\w{3,6}?p‘

  代表要尋找字元位置的符號:

  ^ 和 $ : ^代表在字串的開頭出現,$ 代表在字串的末尾出現。

  樣本 

  string = ‘海燕海東海西‘  

  ^海.   會匹配到 開頭的‘海燕’  ,全部的意思是:匹配開頭是海這一個字,後邊跟一個除分行符號之外的一個字元。

  海.$   會匹配到結尾的‘海西’ ,全部的意思是 :匹配結尾的海+一個除分行符號之外的一個字元。

  字元集[][^]

  [ ]  表示這一個位置可能出現的字元,注意是一個位置,表示多個位置的話,可以是 [ ]*,或者 [ ]+ 等[ ]後邊跟量詞

  [ ^ ]  表示取非,即這一個位置可能出現的字元除了括弧內的,

  

   分組 ()與 或 |

  樣本:

  () 表示把一些字元看成一個整體,  | 是或的意思。

  ([1-9]\d{16}[0-9x]|[1-9]\d{14})   表示先匹配[1-9]\d{16}[0-9x]如果沒有匹配上就匹配[1-9]\d{14}

 

2.Python 下的Regex—— re 模組 

  re模組常用方法:findall、search、 match、 split、 sub、

  re.findall(pattern,) 

  尋找滿足條件的字串,返回一個列表,元素是每一個找到的子字串,

1 樣本:2 str = ‘fhsjdhal66478636666guy66666hhfieyhf‘3 ret5 = re.findall(‘\d{4,6}?‘,str)4 print(ret5)

結果:
[[‘6647‘, ‘8636‘, ‘6666‘]] # 此處是非貪婪模式

  findall中有個分組優先的原則:

# 如果沒有分組,是這樣子的:str = ‘11512319890965443xhfauh630289768776545678ucufy‘ret5 = re.findall(‘[0-9]\d{5}\d{8}\d{3}[0-9x]‘,str)    # ret5 = re.findall(r‘[1-9]\d{16}[0-9x]‘,str)print(ret5)結果是:>>> [‘11512319890965443x‘, ‘630289768776545678‘]假如我分組了,就會返回組裡邊的資訊,str = ‘62012319890965443xhfauh630289768776545678ucufy‘ret5 = re.findall(‘[0-9]\d{5}(\d{8})\d{3}[0-9x]‘,str)# ret5 = re.findall(r‘[1-9]\d{16}[0-9x]‘,str)print(ret5)結果是:>>> [‘19890965‘, ‘76877654‘]其實其他位置的也匹配到了,只是沒有顯示出來而已。

 

  re.resarch()

  在字串內尋找模式比對,只到找到第一個匹配然後返回一個包含匹配資訊的對象,通過.group()方法調用。

1 ret = re.search(‘a‘, ‘eva egon yuan‘).group()2 print(ret) 3 #結果 : ‘a‘

  re.math()

  在字串開始處進行匹配,如果不在開頭,則會報錯,如找到,返回的跟search一樣。

1 ret = re.match(‘a‘, ‘abc‘).group()  2 print(ret)3 4 #結果 : ‘a‘

   re.finditer() 

  返回一個存放匹配結果的迭代器

1 import re2 ret = re.finditer(‘\d‘, ‘ds3sy4784a‘)   #finditer返回一個存放匹配結果的迭代器3 print(ret)  # <callable_iterator object at 0x10195f940>4 print(next(ret).group())  #查看第一個結果5 print(next(ret).group())  #查看第二個結果6 print([i.group() for i in ret])  #查看剩餘的左右結果

 

  re.split  返回一個切割之後的列表。

  ret = re.split(‘[ab]‘, ‘abcd‘)

  # 先按‘a‘分割得到‘‘和‘bcd‘,在對‘‘和‘bcd‘分別按‘b‘分割 print(ret) # [‘‘, ‘‘, ‘cd‘]   注意這裡  

 

  split的優先順序查詢

ret=re.split("\d+","eva3egon4yuan")print(ret) #結果 : [‘eva‘, ‘egon‘, ‘yuan‘]ret=re.split("(\d+)","eva3egon4yuan")print(ret) #結果 : [‘eva‘, ‘3‘, ‘egon‘, ‘4‘, ‘yuan‘]#在匹配部分加上()之後所切出的結果是不同的,#沒有()的沒有保留所匹配的項,但是有()的卻能夠保留了匹配的項,#這個在某些需要保留匹配部分的使用過程是非常重要的。

  re模組其他的方法:

  sub 替換 、compile()編譯成一個對象

ret = re.sub(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘, 1)#將數字替換成‘H‘,參數1表示只替換1個print(ret) #evaHegon4yuan4ret = re.subn(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘)#將數字替換成‘H‘,返回元組(替換的結果,替換了多少次)print(ret)obj = re.compile(‘\d{3}‘)  #將Regex編譯成為一個 Regex對象,規則要匹配的是3個數字ret = obj.search(‘abc123eeee‘) #Regex對象調用search,參數為待匹配的字串print(ret.group())  #結果 : 123

 

  

  

  

 

python與Regex

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.