正則表達式和re模塊

re的元字符

import re

ret = re.findall("e..a", "Hermaeus") #"."是模糊表示一個字符
print(ret)

['erma']

ret = re.findall("^H..m", "Hermaeus") #"^"表示開頭必須是某個字符
print(ret)

['Herm']

ret = re.findall("a..s$", "Hermaeus") #"$"表示結尾必須是某個字符
print(ret)

['aeus']

ret = re.findall("abc*", "abccccc")  #貪婪匹配[0,+∞]
print(ret)

['abccccc']

ret = re.findall("abc+", "abccccc")  #貪婪匹配[1,+∞]
print(ret)

['abccccc']

ret = re.findall("abc?", "abccccc")  #惰性匹配[0,1]
print(ret)

['abc']


ret = re.findall("abc{1,3}", "abccccc")   #貪婪匹配[1,3]
print(ret)

['abccc']

ret = re.findall("abc*?", "abccccc")  #這樣會讓其變成惰性匹配
print(ret)

['ab']

字符集[ ]

即在字符集中任意匹配一個正則表達式

import re

ret = re.findall("a[bc]", "abc")
print(ret)

['ab']

ret = re.findall("[a-z]", "ahfao")
print(ret)

['a', 'h', 'f', 'a', 'o']

ret = re.findall("[%$]", "ada%jf$")  #在字符集裏面除了:- ^ \之外都是普通字符
print(ret)

['%', '$']

##" - " 取在這之間的
ret = re.findall("[1-9]", "1jkah1k2k3j")
print(ret)

['1', '1', '2', '3']

##" ^ " 取反,即在這字符集裏面沒有的
ret = re.findall("[^ab]", "7ajkf2bfjab")
print(ret)

['7', 'j', 'k', 'f', '2', 'f', 'j']

##" \ " 轉義符
ret = re.findall("[\d]", "45dhaf2")
print(ret)

['4', '5', '2']

轉義符

  • 反斜槓後邊跟元字符去除特殊功能,好比\.
  • 反斜槓後邊跟普通字符實現特殊功能,好比\d
  • \d匹配任何十進制數;它至關於類 [0-9]。
  • \D匹配任何非數字字符;它至關於類 [^0-9]。
  • \s匹配任何空白字符;它至關於類 [ \t\n\r\f\v]。
  • \S匹配任何非空白字符;它至關於類 [^ \t\n\r\f\v]。
  • \w匹配任何字母數字字符;它至關於類 [a-zA-Z0-9_]。
  • \W匹配任何非字母數字字符;它至關於類 [^a-zA-Z0-9_]
  • \b匹配一個特殊字符邊界,好比空格 ,&,#等
import re
ret = re.findall(r"I\b", "I am LIST") ##添加"r",就變成了原生字符串,它表示把須要匹配的字符集直接交給模塊處理
print(ret)

分組 ( )

import re
ret = re.search("(?P<id>\d{2})/(?P<name>\w{3})", "23/com") #"?P<id> 取名
print(ret)

<_sre.SRE_Match object; span=(0, 6), match='23/com'> #返回一個對象

print(ret.group())

23/com

print(ret.group("id"))

23

|符號

import re

ret = re.search("(ab)|\d", "rabjk4fk") #二選一
print(ret)
print(ret.group())

re下的經常使用方法

import re
#findall()方法
#返回全部知足匹配條件的結果,放在列表裏
re.findall('a','alvin yuan')    
#search()方法
#函數會在字符串內查找模式匹配,只到找到第一個匹配而後返回一個包含匹配信息的對象,該對象能夠;經過調用group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None。
re.search('a','alvin yuan').group()  
#match()方法
#同search,不過盡在字符串開始處進行匹配
re.match('a','abc').group()     
#split()方法
#先按'a'分割獲得''和'bcd',在對''和'bcd'分別按'b'分割
ret=re.split('[ab]','abcd')     
print(ret)#['', '', 'cd']
#sub()和subn()方法
#替代
ret=re.sub('\d','abc','alvin5yuan6',1)
print(ret)#alvinabcyuan6  
#替代,且能夠選擇次數   
ret=re.subn('\d','abc','alvin5yuan6')
print(ret)#('alvinabcyuanabc', 2)  
#compile()方法
#對象賦予
obj=re.compile('\d{3}')  
ret=obj.search('abc123eeee')
print(ret.group())#123
#finditer()方法
ret=re.finditer('\d','ds3sy4784a')
print(ret)        #<callable_iterator object at 0x10195f940>
                  #返回迭代器
print(next(ret).group())
print(next(ret).group())

注意:app

import re
 
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)['oldboy']     #這是由於findall會優先把匹配結果組裏內容返回,若是想要匹配結果,取消權限便可
 
['oldboy']

ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)

['www.oldboy.com']

分組

在正則表達式中,能夠對過濾到的字符串進行分組,分組使用圓括號的方式:函數

  1. group:和group(0)等價,返回的是整個知足條件的字符串
  2. groups:返回的是裏面的子組,索引從1開始
  3. group(1):返回的是第一個子組,能夠傳入多個

代碼實例:spa

import re
text = "apple price is $99,orange price is $10"
ret = re.search(r".*(\$\d+).*(\$\d+)",text)
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
print(ret.groups())
'''
result:
apple price is $99,orange price is $10
apple price is $99,orange price is $10
$99
$10
('$99', '$10')
'''
相關文章
相關標籤/搜索