Python3.7之re正則表達式

Python3.7之re正則表達式

正則表達式(Regular Expression)用於描述一種字符串匹配的模式,它可用於檢查一個字符串是否含有某個子串,也可用於從字符串中提取匹配的子串,或者對字符串中匹配的子串執行替換操做。python

這個模塊提供了與 Perl 語言相似的正則表達式匹配操做。正則表達式

1、修飾符/Flags標誌符

re.I(re.IGNORECASE): 忽略大小寫
re.M(MULTILINE): 多行模式,改變‘^’和’$’的行爲
re.S(DOTALL): 使'.'匹配包括換行在內的全部字符
re.X(re.VERBOSE) 能夠給你的表達式寫註釋,使其更可讀函數

2、模式

1.單字符匹配規則

'.' 默認匹配除\n以外的任意一個字符,若指定flag DOTALL或S,則匹配任意字符,包括換行spa

res = re.search('.', 'abcd')
res2 = re.search('.', '\nabcd', re.DOTALL)
print(res)
print(res2)
'''
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(0, 1), match='\n'>
'''

[] 匹配[]中列舉的字符code

res = re.search('[0-9]', 'lkso092')
print(res)
'''
<re.Match object; span=(4, 5), match='0'>
'''

'\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的,至關於re.match('abc',"alexabc") 或^對象

res = re.search('\Aabc', 'vivianabc')
res1 = re.search('^abc', 'abcvivian')
res2 = re.match('abc', 'abcvivian')
print(res)
print(res1)
print(res2)
'''
None
<re.Match object; span=(0, 3), match='abc'>
<re.Match object; span=(0, 3), match='abc'>
'''

'\Z' 匹配字符結尾,同$字符串

res = re.search('ac\Z', 'abcacac')
print(res)
'''
<re.Match object; span=(5, 7), match='ac'>
'''

'\d' 匹配數字0-9string

res = re.search('\d', 'kji980')
print(res)
'''
<re.Match object; span=(3, 4), match='9'>
'''

'\D' 匹配非數字it

'\w' 匹配[A-Za-z0-9]io

'\W' 匹配非[A-Za-z0-9]

2.表示數量的規則

'* ' 對它前面的正則式匹配0到任意次重複, 儘可能多的匹配字符串。 ab* 會匹配 'a', 'ab', 或者 'a'後面跟隨任意個'b'。 re.search('a*','aaaabac') 結果'aaaa';

'+' 對它前面的正則式匹配1到任意次重複,ab+ 會匹配 'a' 後面跟隨1個以上到任意個 'b',它不會匹配 'a'。re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']

'?' 對它前面的正則式匹配0到1次重複。 ab? 會匹配 'a' 或者 'ab' 。re.search('b?','alex').group() 匹配b 0次
'{m}' 對其以前的正則式指定匹配 m 個重複;少於 m 的話就會致使匹配失敗。好比,a{6} 將匹配6個 'a' , 可是不能是5個 。re.search('b{3}','alexbbbs').group() 匹配到'bbb'

'{m,n}' 對正則式進行 m 到 n 次匹配,在 m 和 n 之間取儘可能多。 好比,a{3,5} 將匹配 3 到 5個 'a'。忽略 m 意爲指定下界爲0,忽略 n 指定上界爲無限次。 好比 a{4,}b 將匹配 'aaaab' 或者1000個 'a' 尾隨一個 'b',但不能匹配 'aaab'。逗號不能省略,不然沒法辨別修飾符應該忽略哪一個邊界。re.findall("ab{1,3}","abb abc abbcbbb") 結果['abb', 'ab', 'abb']

3.其餘規則

'^' 匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)

'$' 匹配字符串尾或者換行符的前一個字符,在 MULTILINE 模式匹配換行符的前一個字符。在 'foo1\nfoo2\n' 搜索 foo.$ ,一般匹配 'foo2' ,但在 MULTILINE 模式 ,能夠匹配到 'foo1' 。即若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 會匹配到foo1

'|' 匹配|左或|右的正則表達式,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'

'(...)' 分組匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 結果爲'abcabca45'

's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'

'(?P...)' 分組匹配 (?P ) :分組起別名 ,(?P=name):引用別名爲name分組匹配到的字符串

res1 = re.search(r'(?P<group1>\d{3})(?P<group2>[a-z]{3})(?P<group3>[A-Z]{3})', '123123aksEDWDSX')
res2 = re.search(r'(?P<group1>\d{3})(?P<group2>[a-z]{3})(?P<group3>[A-Z]{3})', '123123aaaaksEDWDSX')
print(res1.groupdict())
# {'group1': '123', 'group2': 'aks', 'group3': 'EDW'}
print(res2.groupdict())
# AttributeError: 'NoneType' object has no attribute 'groupdict'

3、模塊對象

re.match()

re.match 嘗試從字符串的起始位置匹配一個模式,若是不是起始位置匹配成功的話,match()就返回none。

函數語法:

re.match(pattern, string, flags=0)

函數參數說明:

參數 描述
pattern 匹配的正則表達式
string 要匹配的字符串。
flags 標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

匹配成功re.match方法返回一個匹配的對象,不然返回None。

咱們可使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))
print(m.groups())

# 010-12345
# 010
# 12345
# ('010', '12345')

若是正則表達式中定義了組,就能夠在Match對象上用group()方法提取出子串來。

注意到group(0)永遠是原始字符串,group(1)、group(2)……表示第一、二、……個子串。

re.search()

search 函數和 match 函數是相似的,區別在於match方法是隻在目標函數開頭匹配一次;search函數是在整個目標函數上匹配一次,一次匹配成功後再也不進行匹配。

一樣search方法返回的也是一個match對象,用法和match方法返回的結果同樣。

print(re.search('www', 'www.runoob.com').group())
print(re.search('com', 'www.runoob.com').group())

# www
# com

re.findall()

在字符串中找到正則表達式所匹配的全部子串,並返回一個列表,若是沒有找到匹配的,則返回空列表。

注意 match 和 search 是匹配一次,findall 匹配全部。

函數語法:

findall(string[, pos[, endpos]])

參數:

string : 待匹配的字符串。
pos : 可選參數,指定字符串的起始位置,默認爲 0。
endpos : 可選參數,指定字符串的結束位置,默認爲字符串的長度。

# 查找字符串中的全部數字
print(re.findall('[0-9]', 'asodi92kjsdc980'))

# ['9', '2', '9', '8', '0']

re.split()

split 方法按照可以匹配的子串將字符串分割後返回列表.

函數語法:

re.split(pattern, string[, maxsplit=0, flags=0])

參數:

參數 描述
pattern 匹配的正則表達式
string 要匹配的字符串。
maxsplit 分隔次數,maxsplit=1 分隔一次,默認爲 0,不限制次數。
flags 標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

s = '9-2*5/3+7/3*99/4*2998+10*568/14'
print(re.split(r"[\*\-\/\+]", s))

# ['9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14']

re.sub()

Python 的 re 模塊提供了re.sub用於替換字符串中的匹配項。

函數語法:

re.sub(pattern, repl, string, count=0, flags=0)

參數:

pattern : 正則中的模式字符串。

repl : 替換的字符串,也可爲一個函數。

string : 要被查找替換的原始字符串。

count : 模式匹配後替換的最大次數,默認 0 表示替換全部的匹配。

phone = "2004-959-559 # 這是一個國外電話號碼"

# 刪除字符串中的 Python註釋
num = re.sub(r'#.*$', "", phone)
print("電話號碼是: ", num)


# 刪除非數字(-)的字符串
num = re.sub(r'\D', "", phone)
print("電話號碼是: ", num)

'''
電話號碼是:  2004-959-559 
電話號碼是:  2004959559
'''

review:

'* ' 對它前面的正則式匹配0到任意次重複, 儘可能多的匹配字符串。

'$' 匹配字符串尾或者換行符的前一個字符

re.compile()

compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數使用。

函數語法:

re.compile(pattern[, flags])

參數:

pattern : 一個字符串形式的正則表達式

flags : 可選,表示匹配模式,好比忽略大小寫,多行模式等

pattern = re.compile(r'[0-9]+')   # 用於匹配至少一個數字
print(pattern.match('one1twe2'))  # 查找頭部,沒有匹配

# None
m = re.compile(r'\d+')
print(m.match('one1twe2', 3, 7))  # 從1位置開始匹配,正好匹配

# <re.Match object; span=(3, 4), match='1'>
相關文章
相關標籤/搜索