這篇文章主要介紹“python模式匹配與正則表達式的使用方法”,在日常操作中,相信很多人在python模式匹配與正則表達式的使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python模式匹配與正則表達式的使用方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
python 中所有的正則表達式函數都在re模塊中。
向re.complie()傳入一個字符串值,來表示正則表達式,它將返回一個Regex模式對象。
Regex 對象的serch()方法查找傳入的字符串,尋找該正則表達式的所有匹配。如果字符串中沒有找到該正則表達式模式,search()方法將返回None。如果找到了該模式,search()方法將返回一個Match對象。Match對象有一個group()方法,它返回被查找字符串中實際匹配的文本。
*正則表達式匹配復習*
*利用括號分組*
假定想要將區號從電話號碼中分離。添加括號將在正則表達式中創建“分組”:(\d\d\d)-(\d\d\d-\d\d\d)。然后使用group()匹配對象方法,從一個分組中獲取匹配的文本。 正則表達式字符串中的第一對括號是第1組。第二對括號是第2組。向group()匹配對象方法傳入整數1或者2,就可以匹配文本的不同部分。向group()方法中傳入0或者不傳入參數,將返回整個匹配的文本。
>>> import re
>>> phoneNumberRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d)')
>>> mo = phoneNumberRegex.search('my number is 415-555-4242.')
>>> mo.group(1)'415'>>> mo.groups()
('415', '555-424')>>> heroRegex = re.compile(r'batman|tina fey')
>>> mo1 = heroRegex.search('batman and tina fey')
>>> mo1.group()'batman'>>> mo1 = heroRegex.search(' tina fey and batman ')
>>> mo1.group()'tina fey'可以試用管道來匹配多個模式中的一個,作為正則表達式的一部分。
>>> batRegex = re.complie(r'bat(man|mobile|copter|bat)')
>>> batRegex = re.compile(r'bat(man|mobile|copter|bat)')
>>> mo = batRegex.search('batmobile lost a wheel')
>>> mo.group()'batmobile'>>> mo.group(1)'mobile'>>>*用問號實現可選匹配*
有時候,向匹配的模式是可選的。就是說,不論這段文本在不在,正則表達式都會認為匹配。字符?表明它前面的分組在這個模式中是可選的。
>>> phoneNumberRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d')
>>> mo = phoneNumberRegex.search('my number is 415-555-4242.')
>>> mo.group()'415-555-424'>>> mo = phoneNumberRegex.search('my number is 555-4242.')
>>> mo.group()'555-424'正則表達式中(\d\d\d-)?部分表明,模式(\d\d\d-)是可選的。也就是匹配這個問號之前的分組零次或一次
*用星號匹配零次或多次*
“*”星號之前的分組,可以在文本中出現任意次。
*用加號匹配一次或多次*
“+”加號之前的分區,至少在文本中出現一次
*用花括號匹配特定的次數*
如果想要一個分組重復特定的次數,就在正則表達式中該分組的后面,跟上畫括號包圍的數字。例如正則表達式(Ha){3}將匹配字符串’HaHaHa’ 除了一個數字,還可以指定給一個范圍,即在花括號中寫下一個最小值、一個逗號和一個最大值。例如在正則表達(Ha){3,5}將匹配’HaHaHa’,’HaHaHaHa’,’HaHaHaHaHaHa’ 也可以不謝花括號中第一個或第二個數字,不限定最小值或最大值。例如(Ha){3,}將匹配3次或者更多次的實例,(Ha){,5}將匹配0到5次實例。
*貪心匹配和非貪心匹配*
python的正則表達式模式的是“貪心”的,這表示在有二意的情況下,他們會盡可能的匹配最長的字符串?;ɡㄌ柕摹胺秦澬摹卑姹酒ヅ浔M可能最短的字符串,即在結束的花括號后跟著一個問號。
問號在正則表達式中有兩種含義:聲明非貪心匹配或表示可選的分組。
*findall()方法*
除了search方法外,Regex對象也有一個findall()方法。search()將返回一個Match對象,包含被查找字符串中的“第一次”匹配的文本,而findall()方法將返回一組字符串,包含被查找字符串中的所有匹配。
*字符分類*
| 縮寫字符分類 | 表示 |
|---|---|
| \d | 0到9的任何數字 |
| \D | 除0到9的數字以外的任何字符 |
| \w | 任何字母、數字或下劃線字符(可以認為是匹配“單詞”字符 |
| \W | 除字母、數字和下劃線以外的任何字符 |
| \s | 空格、制表符或換行符(可以認為是匹配“空白”字符) |
| \S | 除空格、制表符和換行符以外的任何字符 |
*建立自己的字符分類*
#匹配所有非元音字符>>> consonantRegex = re.compile(r'[^aeiouAEIOU]')
>>> consonantRegex.findall('RoboCop eats baby food. BABY FOOD.')
['R', 'b', 'C', 'p', ' ', 't', 's', ' ', 'b', 'b', 'y', ' ', 'f', 'd', '.', ' ', 'B', 'B', 'Y', ' ', 'F', 'D', '.']*插入字符和美元字符*
可以在正則表達式的開始處使用插入符號(^ ),表明匹配必須發生在被查找文本開始處。類似地,可以再正則表達式的末尾加上美元符號(),表示該字符串必須以這個正則表達式的模式結束??梢酝瑫r使用和,表明整個字符串必須匹配該模式,也就是說,只匹配該字符串的某個子集是不夠的。
>>> beginsWithHello = re.compile(r'^Hello')
>>> beginsWithHello.search('Hello world!')'Hello'>
>>> hh=beginsWithHello.search('Hello world!')
>>> hh.group()'Hello'>>> endsWithNumber = re.compile(r'\d$')
>>> ss=endsWithNumber.search('Your number is 42')
>>> ss.group()'2'>>> wholeStringIsNum = re.compile(r'^\d+$')
>>> rr=wholeStringIsNum.search('1234567890')
>>> rr.group()'1234567890'*通配字符*
在正則表達式中,.(句點)字符稱為“通配符”。它匹配除了換行之外的所有 字符。
>>> atRegex = re.compile(r'.at')
>>> atRegex.findall('The cat in the hat sat on the flat mat.')
['cat', 'hat', 'sat', 'lat', 'mat']句點字符只匹配一個字符,這就是為什么在前面的例子中,對于文本flat,只匹配 lat。
*用點-星匹配所有字符*
有時候想要匹配所有字符串。例如,假定想要匹配字符串’First Name:’,接下來是任意文本,接下來是’Last Name:’,然后又是任意文本??梢杂命c-星(.*)表示“任意文本”?;貞浺幌?,句點字符表示“除換行外所有單個字符”,星號字符表示“前面字符出現零次或多次”。
>>> nameRegex = re.compile(r'First Name: (.*) Last Name: (.*)')
>>> mo = nameRegex.search('First Name: Al Last Name: Sweigart')
>>> mo.group(1)'Al'>>> mo.group(2)'Sweigart'*用句點字符匹配換行*
點-星將匹配除換行外的所有字符。通過傳入 re.DOTALL 作為 re.compile()的第二個參數,可以讓句點字符匹配所有字符,包括換行字符。
>>> noNewlineRegex = re.compile('.*')
>>> noNewlineRegex.search('Serve the public trust.\nProtect the innocent.
\nUphold the law.').group()'Serve the public trust.'>>> newlineRegex = re.compile('.*', re.DOTALL)
>>> newlineRegex.search('Serve the public trust.\nProtect the innocent.
\nUphold the law.').group()'Serve the public trust.\nProtect the innocent.\nUphold the law.'*正則表達式符號復習*
不區分大小寫的匹
向re.comlile()傳入re.IGNORECASE或re.I,作為第二個參數
*用sub()方法替換字符串*
Regex對象的sub()方法需要傳入兩個參數。第一個參數是字符串,用于取代發現的匹配。第二個參數是一個字符串,即正則表達式。sub()方法返回替換完成后的字符串。
>>> namesRegex = re.compile(r'Agent \w+')
>>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.')'CENSORED gave the secret documents to CENSORED.'有時候,你可能需要使用匹配的文本本身,作為替換的一部分。在 sub()的第一個參數中,可以輸入\1、\2、\3……。表示“在替換中輸入分組1、2、3……的文本”。
例如,假定想要隱去密探的姓名,只顯示他們姓名的第一個字母。要做到這一點,可以使用正則表達式 Agent (\w)\w*,傳入 r’\1’作 sub()的第一個參數。字符串中的\1 將由分組 1匹配的文本所替代,也就是正則表達式的(\w)分組。
>>> agentNamesRegex = re.compile(r'Agent (\w)\w*') >>> agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') A**** told C**** that E**** knew B**** was a double agent.'
如果要匹配的文本模式很簡單,正則表達式就很好。但匹配復雜的文本模式,可能需要長的、費解的正則表達式。你可以告訴re.compile(),忽略正則表達式字符串中的空白符和注釋,從而緩解這一點。要實現這種詳細模式,可以向 re.compile() 傳入變量 re.VERBOSE,作為第二個參數。
項目 電話號碼和 E-mail 地址提取程序 假設你有一個無聊的任務,要在一篇長的網頁或文章中,找出所有電話號碼和郵件地址。如果手動翻頁,可能需要查找很長時間。如果有一個程序,可以在剪貼板的文本中查找電話號碼和 E-mail地址,那你就只要按一下Ctrl-A選擇所有文本,按下 Ctrl-C 將它復制到剪貼板,然后運行你的程序。它會用找到的電話號碼和 E-mail地址,替換掉剪貼板中的文本。
import re
import pyperclip
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))?
(\s\|-|\.)?
(\d{3})
(\s|-|\.)
(\d{4})
(\\s*(ext|x|ext.)\s*(\d{2,5}))?
)''', re.VERBOSE)
emailRegex = re.compile(r'''
([a-zA-Z0-9._%+-]+
@
[a-zA-Z0-9.-]+
(\.[a-zA-Z]{2,4})
)''', re.VERBOSE)
text = str(pyperclip.paste())
matches = []for groups in phoneRegex.findall(text):
phoneNum = '-'.join([groups[1],groups[3],groups[5]])
if groups[8] != '':
phoneNum += 'x' + groups[8]
matches.append(phoneNum)for groups in emailRegex.findall(text):
matches.append(groups[0])if len(matches) >0:
pyperclip.copy('\n'.join(matches))
print('Copied to clipboard :')
print('\n'.join(matches))else:
print('No phone numbers or email addresses found.')到此,關于“python模式匹配與正則表達式的使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。