1. 程式人生 > >Python的re模塊

Python的re模塊

擔心 直觀 match 獲取 port .com ring tex str

Python的re模塊

1、 compile(pattern):創建模式對象

import re

pat = re.compile(‘A‘)

m = pat.search(‘CBA‘)

#等價於re.search(‘A’,’CBA’)

print(m)

#<_sre.SRE_Match object; span=(2, 3), match=‘A‘>

import re
pat = re.compile(‘a‘)
m = pat.search(‘CBA‘)
print(m)     #沒有匹配到,返回None

2、 search(pattern,string):在字符串中尋找模式

import re    
m = re.search(‘asd‘,‘ASDasd‘)      
print(m)     
#<_sre.SRE_Match object; span=(3, 6), match=‘asd‘>       

上面的函數返回都可以在if條件語句中進行判斷:

If pat.search(‘asd’,’ASDasd’):

Print(‘ok’)

運行輸出了‘ok’。

3、 split(pattern,string):根據模式分割字符串,返回列表

a、

import re
m=re.split(‘,‘,‘a,s,d,asd‘)    #以逗號為分界
print(m)      #[‘a‘, ‘s‘, ‘d‘, ‘asd‘]

b、

import re
pat = re.compile(‘,‘)
m=pat.split(‘a,s,d,asd‘)
print(m)      #[‘a‘, ‘s‘, ‘d‘, ‘asd‘]

c、

import re
m = re.split(‘[,]+‘,‘a,s,d ,,,,,asd‘)
#正則匹配:[,]+,後面說明
print(m)     #[‘a‘, ‘s‘, ‘d ‘, ‘asd‘]

d、

import re
m= re.split(‘[,]+‘,‘a,s,d,e, ,,,,,asd‘,maxsplit=2)
#maxsplit最多分割次數
print(m)   
#[‘a‘, ‘s‘, ‘d,e, ,,,,,asd‘]

e、

import re

pat = re.compile(‘[,]+‘)

m = pat.split(‘a,s,d,e, ,,,,,asd‘,maxsplit=2)

print(m) # [‘a‘, ‘s‘, ‘d,e, ,,,,,asd‘]

4、 findall(pattern,string):列表形式返回匹配項

import re

c=re.findall(‘a‘,‘aASDaDSDa‘)

print(c) # [‘a‘, ‘a‘, ‘a‘]

import re

pat = re.compile(‘a‘)

c = pat.findall(‘aASDaDSDa‘)

print(c) # [‘a‘, ‘a‘, ‘a‘]

import re

pat = re.compile(‘[A-Z]+‘)

c = pat.findall(‘aASDaDSDa‘)

print(c) # [‘ASD‘, ‘DSD‘]

import re

pat = re.compile(‘[A-Z]‘)

c = pat.findall(‘aASDaDSDa‘)

print(c) # [‘A‘, ‘S‘, ‘D‘, ‘D‘, ‘S‘, ‘D‘]

import re

pat = re.compile(‘[A-Za-z]+‘)

#正則匹配:‘[A-Za-z]+‘匹配所有單詞

c = pat.findall(‘aASD aDSDa‘)

print(c) # [‘aASD‘, ‘aDSDa‘]

import re

pat = re.compile(‘[A-Za-z]‘)

c = pat.findall(‘aASD aDSDa‘)

print(c)

#[‘a‘, ‘A‘, ‘S‘, ‘D‘, ‘a‘, ‘D‘, ‘S‘, ‘D‘, ‘a‘]

5、 sub(pat,repl,string):用repl替換pat匹配項

import re

c = re.sub(‘a‘,‘A‘,‘aASD aDSDa‘)

print(c) #AASD ADSDA

import re

pat = re.compile(‘a‘)

c = pat.sub(‘A‘,‘aASD aDSDa‘)

print(c) # AASD ADSDA

import re

pat = re.compile(r‘www\.(.*)\..{3}‘)

‘‘‘

Pythonstring前面加上‘r’,是為了告訴編輯器這個stringraw string,不要轉譯反斜杠‘\’。

例如,\nraw string中,是兩個字符,\n,而不會轉譯為換行符。

由於正則表達式和\會有沖突,因此,當一個字符串使用了正則表達式後,最好在前面加上‘r’。

於大多數編程語言相同,正則表達式裏用“\”作為轉義字符,這就可能造成反斜杠困擾。

假如你需要匹配文本中的字符“\”,那麽使用編程語言表示的正則表達式裏將需要4個反斜杠“\\\\:

前兩個和後兩個分別用於在編程語言裏轉義成反斜杠,轉換成兩個反斜杠後再在正則表達式裏轉義成一個反斜杠。

Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可以使用r\\”表示。

同樣,匹配一個數字的\\d可以寫成r\d”。

有了原生字符串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀。

最好記住這句話:

當一個字符串使用了正則表達式後,最好在前面加上‘r’,這樣你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀

‘‘‘

ret = pat.match(‘www.dxy.com‘).group(1)

print(ret) # dxy

a=re.sub(r‘www\.(.*)\..{3}‘,r‘\1‘,‘hello,www.dxy.com‘)

print(a) # hello,dxy

b = pat.sub(r‘\1‘,‘hello,www.dxy.com‘)

print(b) # hello,dxy

‘‘‘

r‘\1是第一組的意思

通過正則匹配找到符合規則的“www.dxy.com”,取得組1字符串去替換整個匹配

‘‘‘

pat = re.compile(r‘(\w+)(\w+)‘)

s = ‘hello world! hello hz!‘

d = pat.findall(‘hello world ! hello hz !‘)

print(d)

# [(‘hell‘, ‘o‘), (‘worl‘, ‘d‘), (‘hell‘, ‘o‘), (‘h‘, ‘z‘)]

c=pat.sub(r‘\2\1‘,s)

print(c) # ohell dworl! ohell zh!

‘‘‘

通過正則得到組1hell),組2o),再通過sub去替換。即組1替換組2,組2替換組1,調換位置

‘‘‘

6、 escape(string):對字符串裏面的特殊字符串進行轉義

import re

a=re.escape(‘www.dxy.com‘)

print(a) #www\.dxy\.com

7、group:獲取子模式(組)的匹配項

上面的函數中,只有match、search有group方法,其他的函數沒有。

import re

pat = re.compile(r‘www\.(.*)\.(.*)‘)

#用()表示1個組,2個組

m = pat.match(‘www.dxy.com‘)

print(m.group())

#默認為0,表示匹配整個字符串。結果:www.dxy.com

print(m.group(1))

#返回給定組1匹配的字符串。結果:dxy

print(m.group(2))

#返回給定組2匹配的字符串。結果:com

8、 start:給定組匹配項的開始位置

import re

pat = re.compile(r‘www\.(.*)\.(.*)‘)

m = pat.match(‘www.dxy.com‘)

print(m.start(2)) #組2開始的索引,結果:8

9、end:給定組匹配項的結束位置

import re

pat = re.compile(r‘www\.(.*)\.(.*)‘)

m = pat.match(‘www.dxy.com‘)

print(m.end(2)) #組2結束的索引。結果:11

10、span:給定組匹配項的開始結束位置

import re

pat = re.compile(r‘www\.(.*)\.(.*)‘)

m = pat.match(‘www.dxy.com‘)

print(m.span(2))

#組2的開始、結束的索引。結果為(8,11)

Python的re模塊