溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python模式匹配與正則表達(dá)式的使用方法

發(fā)布時(shí)間:2022-01-20 16:14:16 來(lái)源:億速云 閱讀:152 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“python模式匹配與正則表達(dá)式的使用方法”,在日常操作中,相信很多人在python模式匹配與正則表達(dá)式的使用方法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python模式匹配與正則表達(dá)式的使用方法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

python 中所有的正則表達(dá)式函數(shù)都在re模塊中。

向re.complie()傳入一個(gè)字符串值,來(lái)表示正則表達(dá)式,它將返回一個(gè)Regex模式對(duì)象。

Regex 對(duì)象的serch()方法查找傳入的字符串,尋找該正則表達(dá)式的所有匹配。如果字符串中沒(méi)有找到該正則表達(dá)式模式,search()方法將返回None。如果找到了該模式,search()方法將返回一個(gè)Match對(duì)象。Match對(duì)象有一個(gè)group()方法,它返回被查找字符串中實(shí)際匹配的文本。

*正則表達(dá)式匹配復(fù)習(xí)*

  • 1.用import re導(dǎo)入正則表達(dá)式模塊
  • 2.用re.compile()函數(shù)創(chuàng)建一個(gè)Regex對(duì)象(記得使用原始字符串)
  • 3.向Regex對(duì)象的search()方法傳入想查找的字符串。它返回一個(gè)Match對(duì)象。
  • 4.調(diào)用Match對(duì)象的group()方法,返回實(shí)際匹配文本字符串。

*利用括號(hào)分組*

假定想要將區(qū)號(hào)從電話號(hào)碼中分離。添加括號(hào)將在正則表達(dá)式中創(chuàng)建“分組”:(\d\d\d)-(\d\d\d-\d\d\d)。然后使用group()匹配對(duì)象方法,從一個(gè)分組中獲取匹配的文本。 正則表達(dá)式字符串中的第一對(duì)括號(hào)是第1組。第二對(duì)括號(hào)是第2組。向group()匹配對(duì)象方法傳入整數(shù)1或者2,就可以匹配文本的不同部分。向group()方法中傳入0或者不傳入?yún)?shù),將返回整個(gè)匹配的文本。

>>> 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')
  • 如果要一次獲取所有分組,那么使用groups()方法
  • 字符“|”稱為管道。希望匹配許多表達(dá)式中的一個(gè)時(shí),就可以使用它。
  • 如果查找的字符串中,兩個(gè)或者多個(gè)都出現(xiàn)時(shí),第一次出現(xiàn)的匹配文本將作為Match對(duì)象返回。
>>> 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'

可以試用管道來(lái)匹配多個(gè)模式中的一個(gè),作為正則表達(dá)式的一部分。

>>> 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'>>>

*用問(wèn)號(hào)實(shí)現(xiàn)可選匹配*

有時(shí)候,向匹配的模式是可選的。就是說(shuō),不論這段文本在不在,正則表達(dá)式都會(huì)認(rèn)為匹配。字符?表明它前面的分組在這個(gè)模式中是可選的。

>>> 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\d-)是可選的。也就是匹配這個(gè)問(wèn)號(hào)之前的分組零次或一次

*用星號(hào)匹配零次或多次*

“*”星號(hào)之前的分組,可以在文本中出現(xiàn)任意次。

*用加號(hào)匹配一次或多次*

“+”加號(hào)之前的分區(qū),至少在文本中出現(xiàn)一次

*用花括號(hào)匹配特定的次數(shù)*

如果想要一個(gè)分組重復(fù)特定的次數(shù),就在正則表達(dá)式中該分組的后面,跟上畫(huà)括號(hào)包圍的數(shù)字。例如正則表達(dá)式(Ha){3}將匹配字符串’HaHaHa’ 除了一個(gè)數(shù)字,還可以指定給一個(gè)范圍,即在花括號(hào)中寫(xiě)下一個(gè)最小值、一個(gè)逗號(hào)和一個(gè)最大值。例如在正則表達(dá)(Ha){3,5}將匹配’HaHaHa’,’HaHaHaHa’,’HaHaHaHaHaHa’ 也可以不謝花括號(hào)中第一個(gè)或第二個(gè)數(shù)字,不限定最小值或最大值。例如(Ha){3,}將匹配3次或者更多次的實(shí)例,(Ha){,5}將匹配0到5次實(shí)例。

*貪心匹配和非貪心匹配*

python的正則表達(dá)式模式的是“貪心”的,這表示在有二意的情況下,他們會(huì)盡可能的匹配最長(zhǎng)的字符串。花括號(hào)的“非貪心”版本匹配盡可能最短的字符串,即在結(jié)束的花括號(hào)后跟著一個(gè)問(wèn)號(hào)。

問(wèn)號(hào)在正則表達(dá)式中有兩種含義:聲明非貪心匹配或表示可選的分組。

*findall()方法*

除了search方法外,Regex對(duì)象也有一個(gè)findall()方法。search()將返回一個(gè)Match對(duì)象,包含被查找字符串中的“第一次”匹配的文本,而findall()方法將返回一組字符串,包含被查找字符串中的所有匹配。

  • 如果調(diào)用在一個(gè)沒(méi)有分組的正則表達(dá)式上,例如\d\d\d-\d\d\d-\d\d\d\d,方法findall()將返回一個(gè)匹配字符串的列表,例如[‘414-555-9999′,’212-555-0000’]
  • 如果調(diào)用在一個(gè)有分組的正則表達(dá)式上,例如(\d\d\d)-(\d\d\d)-(\d\d\d\d),方法findall()將返回一個(gè)字符串的元組列表(每一個(gè)分組對(duì)應(yīng)一個(gè)字符串),例如[(‘415′,’555′,’1121’),(‘212’,’555,’0000)]

*字符分類*

縮寫(xiě)字符分類表示
\d0到9的任何數(shù)字
\D除0到9的數(shù)字以外的任何字符
\w任何字母、數(shù)字或下劃線字符(可以認(rèn)為是匹配“單詞”字符
\W除字母、數(shù)字和下劃線以外的任何字符
\s空格、制表符或換行符(可以認(rèn)為是匹配“空白”字符)
\S除空格、制表符和換行符以外的任何字符

*建立自己的字符分類*

  • 用方括號(hào)定義自己的字符分類。例如,字符分類[adiouAEIOU]將匹配所有原因字符,不論大小寫(xiě)。
  • 也可以石永紅短橫線表示字母或者數(shù)字的范圍。例如[0-5]只匹配數(shù)字0到5
  • 在方括號(hào)內(nèi),普通的正則表達(dá)式符號(hào)不會(huì)被解釋。
  • 通過(guò)在字符分類的左方括號(hào)后加上一個(gè)插入字符(^),就可以得到“非字符類”。非字符類將匹配不在這個(gè)字符類中的所有字符。
#匹配所有非元音字符>>> 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', '.']

*插入字符和美元字符*

可以在正則表達(dá)式的開(kāi)始處使用插入符號(hào)(^ ),表明匹配必須發(fā)生在被查找文本開(kāi)始處。類似地,可以再正則表達(dá)式的末尾加上美元符號(hào)(),表示該字符串必須以這個(gè)正則表達(dá)式的模式結(jié)束??梢酝瑫r(shí)使用和,表明整個(gè)字符串必須匹配該模式,也就是說(shuō),只匹配該字符串的某個(gè)子集是不夠的。

>>> 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'

*通配字符*

在正則表達(dá)式中,.(句點(diǎn))字符稱為“通配符”。它匹配除了換行之外的所有 字符。

>>> atRegex = re.compile(r'.at')
>>> atRegex.findall('The cat in the hat sat on the flat mat.')
['cat', 'hat', 'sat', 'lat', 'mat']

句點(diǎn)字符只匹配一個(gè)字符,這就是為什么在前面的例子中,對(duì)于文本flat,只匹配 lat。

*用點(diǎn)-星匹配所有字符*

有時(shí)候想要匹配所有字符串。例如,假定想要匹配字符串’First Name:’,接下來(lái)是任意文本,接下來(lái)是’Last Name:’,然后又是任意文本??梢杂命c(diǎn)-星(.*)表示“任意文本”?;貞浺幌?,句點(diǎn)字符表示“除換行外所有單個(gè)字符”,星號(hào)字符表示“前面字符出現(xiàn)零次或多次”。

>>> 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'

*用句點(diǎn)字符匹配換行*

點(diǎn)-星將匹配除換行外的所有字符。通過(guò)傳入 re.DOTALL 作為 re.compile()的第二個(gè)參數(shù),可以讓句點(diǎn)字符匹配所有字符,包括換行字符。

>>> 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.'

*正則表達(dá)式符號(hào)復(fù)習(xí)*

  • ?匹配零次或一次前面的分組。
  • *匹配零次或多次前面的分組。
  • +匹配一次或多次前面的分組。
  • {n}匹配 n 次前面的分組。
  • {n,}匹配 n 次或更多前面的分組。
  • {,m}匹配零次到 m 次前面的分組。
  • {n,m}匹配至少 n 次、至多 m 次前面的分組。
  • {n,m}?或*?或+?對(duì)前面的分組進(jìn)行非貪心匹配。
  • ^spam 意味著字符串必須以 spam 開(kāi)始。
  • spam$意味著字符串必須以 spam 結(jié)束。
  • .匹配所有字符,換行符除外。
  • \d、\w 和\s 分別匹配數(shù)字、單詞和空格。
  • \D、\W 和\S 分別匹配出數(shù)字、單詞和空格外的所有字符。
  • [abc]匹配方括號(hào)內(nèi)的任意字符(諸如 a、b 或 c)。
  • [^abc]匹配不在方括號(hào)內(nèi)的任意字符。

不區(qū)分大小寫(xiě)的匹

向re.comlile()傳入re.IGNORECASE或re.I,作為第二個(gè)參數(shù)

*用sub()方法替換字符串*

Regex對(duì)象的sub()方法需要傳入兩個(gè)參數(shù)。第一個(gè)參數(shù)是字符串,用于取代發(fā)現(xiàn)的匹配。第二個(gè)參數(shù)是一個(gè)字符串,即正則表達(dá)式。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.'

有時(shí)候,你可能需要使用匹配的文本本身,作為替換的一部分。在 sub()的第一個(gè)參數(shù)中,可以輸入\1、\2、\3……。表示“在替換中輸入分組1、2、3……的文本”。

例如,假定想要隱去密探的姓名,只顯示他們姓名的第一個(gè)字母。要做到這一點(diǎn),可以使用正則表達(dá)式 Agent (\w)\w*,傳入 r’\1’作 sub()的第一個(gè)參數(shù)。字符串中的\1 將由分組 1匹配的文本所替代,也就是正則表達(dá)式的(\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.'

如果要匹配的文本模式很簡(jiǎn)單,正則表達(dá)式就很好。但匹配復(fù)雜的文本模式,可能需要長(zhǎng)的、費(fèi)解的正則表達(dá)式。你可以告訴re.compile(),忽略正則表達(dá)式字符串中的空白符和注釋,從而緩解這一點(diǎn)。要實(shí)現(xiàn)這種詳細(xì)模式,可以向 re.compile() 傳入變量 re.VERBOSE,作為第二個(gè)參數(shù)。

項(xiàng)目 電話號(hào)碼和 E-mail 地址提取程序 假設(shè)你有一個(gè)無(wú)聊的任務(wù),要在一篇長(zhǎng)的網(wǎng)頁(yè)或文章中,找出所有電話號(hào)碼和郵件地址。如果手動(dòng)翻頁(yè),可能需要查找很長(zhǎng)時(shí)間。如果有一個(gè)程序,可以在剪貼板的文本中查找電話號(hào)碼和 E-mail地址,那你就只要按一下Ctrl-A選擇所有文本,按下 Ctrl-C 將它復(fù)制到剪貼板,然后運(yùn)行你的程序。它會(huì)用找到的電話號(hào)碼和 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.')

到此,關(guān)于“python模式匹配與正則表達(dá)式的使用方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI