re 庫(python正則庫)


re 庫(python正則庫)

2021-02-20 客玉京

正則表達式的作用:

正則表達式的優勢是:一行勝千言

python中的正則表達式:

編譯

怎麼在python中使用正則表達式?

簡潔:一組字符串的表達式

編譯:將符合正則表達式語法的字符串轉換成正則表達式特徵

正則表達式的語法

正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

正則表達式是由字符和操作符組成。

正則表達式常用操作符操作符說明實例.表示任何單個字符
[]字符集,對單個字符給出取值範圍[abc]表示a、b、 c, [a-z]表示a到z單個字符[^]非字符集, 對單個字符給出排除範圍[^ abc]表示非a或b或c的單個字符*前一個字符0次或無限次擴展abc*表示ab、abc、 abcc、 abccc等+前一個字符1次或無限次擴展abc+表示abc、abcc、 abccc等?前一個字符0次或1次擴展abc?表示ab、abc|左右表達式任意一個abc|def表示abc、def{m}擴展前一個字符m次ab{2}c表示abbc{m,n}擴展前一個字符m至n次(含n)ab{1,2}c表示abc、abbe^匹配字符串開頭^abc表示abc且在一個 字符串的開頭$匹配字符串結尾abc$表示abc且在一個字符串的結尾()分組標記,內部只能使用操作符(abc)表示abe, (abcldef)表示abc、 defd數字,等價於[0-9]
w單詞字符,等價於[A-Za-z0-9]

經典正則表達式

正則表達式正則表達式含義^[A-Za-z]+$由26個字母組成的字符串^[A-Za-z0-9]+$由26個字母和數字組成的字符串^-?d+$整數形式的字符串^[0-9]*[1-9][0-9]*$正整數形式的字符串[1-9]d{5}中國境內郵政編碼,6位[u4e00- u9fa5]匹配中文字符d{3}-d{8}|d{4)}-d{7)}國內電話號碼,010-68913536(([1-9]? d | 1 d {2} | 2[0-4] d | 25[0-5])。){3}([1-9]? d | 1 d {2} | 2[0-4] d | 25[0-5])IP位址的精確表達式

re庫主要功能函數

函數含義re.search()在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象re.match()從一個字符串的開始位置起匹配正則表達式,返回match對象re.findall()搜索字符串,以列表類型返回全部能匹配的子串re.split()將一個字符串按照正則表達式匹配結果進行分割,返回列表類型re.finditer()搜索字符串,返回一個匹配結果的疊代類型,每個疊代元素是match對象re.sub()在一個字符串中替換所有匹配正則表達式的子串,返回替換後的字符串

研究()

在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象

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

re.search的(flags)常用標記

常用標記說明re.I re.IGNORECASE忽略正則表達式的大小寫,[A‐Z]能夠匹配小寫字符re.M re.MULTILINE正則表達式中的^操作符能夠將給定字符串的每行當作匹配開始re.S re.DOTALL正則表達式中的.操作符能夠匹配所有字符,默認匹配除換行外的所有字符

>>> import re

# 使用search方法,
>>> match = re.search(r'[1-9]d{5}','BIT 100081')
# 判斷match與否,直接使用if語句判斷
>>> if match:
...     print(match.group(0))
...
100081
>>> match.group()
'100081're.match

match()函數從字符串的起始位置開始匹配。如果匹配成功,則返回match對象;否則返回None。

re.match(pattern, string, flags=0)
>>> import re
# match()函數從字符串的起始位置開始匹配
>>> match = re.match(r'[1-9]d{5}','BIT 100081')
>>> match.group()
Traceback (most recent call last):
 File "", line 1, in
AttributeError: 'NoneType' object has no attribute 'group'
# 上面的錯誤信息提示顯示匹配爲空
# 結合match()函數從字符串的起始位置開始匹配,調整數據
# 將'BIT 100081'調整爲'100081 BIT'
>>> match = re.match(r'[1-9]d{5}','100081 BIT')
>>> if match:
...     print(match.group(0))
...
100081re.findall()

findall()函數用來搜索字符串,以列表類型返回全部能匹配的子串。

re.findall(pattern, string, flags=0)
>>> import re
# 搜索字符串,以列表類型返回
>>> list = re.findall(r'[1-9]d{5}','BIT100081 TSU100084')
# 將後面匹配的字符串列印
>>> list
['100081', '100084']re.split()

將一個字符串按照正則表達式匹配結果進行分割,返回列表類型。

re.split(pattern, string, maxsplit=0, flags=0)
>>> import re
# split函數使用表達式去匹配字符串匹配的部分去掉,剩下的作爲元素
>>> re.split(r'[1-9]d{5}','BIT100081 TSU100084')
['BIT', ' TSU', '']
# 可見上結果,分割之後的是一個列表
# 增加maxsplit約束,使得maxsplit=1
>>> re.split(r'[1-9]d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT', ' TSU100084']finditer()

搜索字符串,返回一個匹配結果的疊代類型,每個疊代元素是match對象

re.finditer(pattern, string, flags=0)
>>> import re
# 使用for循環疊代的獲取match的匹配結果
>>> for m in re.finditer(r'[1-9]d{5}','BIT100081 TSU100084'):
...     if m:
...             print(m.group(0))
...
100081
100084sub()

在一個字符串中替換所有匹配正則表達式的子串, 返回替換後的字符串.

re.sub(pattern, repl, string, count=0, flags=0)
>>> import re
>>> re.sub(r'[1-9]d{5}','替換','BIT100081 TSU100084')
'BIT替換 TSU替換'
>>> re.sub(r'[1-9]d{5}','替換郵政編碼','BIT100081 TSU100084')
'BIT替換郵政編碼 TSU替換郵政編碼'compile()

將正則表達式的字符串形式編譯成正則表達式對象語法:

regex = re.compile(pattern, flags=0)

>>> import re
>>> match = re.search(r'[1-9]d{5}','BIT100081')
>>> match.group()
'100081'
>>> match = re.search(r'[1-9]d{5}','YUS100084')
>>> match.group()
'100084'
>>> regex = re.compile(r'[1-9]d{5}')
>>> match = regex.search('BIT100081')
>>> match.group()
'100081'
>>> match = regex.search('TUS100084')
>>> match.group()
'100084'


re庫函數去掉正則表達式用法函數說明regex.search()在一個字符串中搜索匹配正則表達式的第一個位置, 返回match對象regex.match()從一個字符串的開始位置起匹配正則表達式,返回match對象regex.findall()搜索字符串,以列表類型返回全部能匹配的子串regex.split()將一個字符串按照正則表達式匹配結果進行分割,返回列表類型regex.fiditer()搜索字符串,返回-個匹配結果的疊代類型,每個疊代元素是match對象regex.sub()在一個字符串中替換所有匹配正則表達式的子串,返回替換後的字符串貪婪匹配和最小匹配

>>> import re
>>> match = re.search(r'P.*N', 'P1N22N333N444N')
>>> match.group(0)
'P1N22N333N444N'
>>> match = re.search(r'P.*?N', 'P1N22N333N444N')
>>> match.group(0)
'P1N'操作符說明*?前一個字符0次或無限次擴展,最小匹配+?前一個字符1次或無限次擴展,最小匹配??前一個字符0次或1次擴展,最小匹配{m,n}?擴展前一個字符m至n次(含n),最小匹配