溫馨提示×

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

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

Python正則表達(dá)式的使用教程

發(fā)布時(shí)間:2021-09-17 11:10:02 來(lái)源:億速云 閱讀:128 作者:chen 欄目:編程語(yǔ)言

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

 介紹:

正則表達(dá)式用于識(shí)別模式(pattern)是否存在于給定的字符(字符串)序列中。它們有助于處理文本數(shù)據(jù),這通常是涉及文本挖掘的數(shù)據(jù)科學(xué)項(xiàng)目的先決條件。您一定遇到過(guò)一些正則表達(dá)式的應(yīng)用程序:它們?cè)?a title="服務(wù)器" target="_blank" href="http://www.kemok4.com/">服務(wù)器端用于在注冊(cè)過(guò)程中驗(yàn)證電子郵件地址或密碼的格式,用于解析文本數(shù)據(jù)文件以查找,替換或刪除某些字符串等。

內(nèi)容:

正則表達(dá)式非常強(qiáng)大,在本教程中,您將學(xué)習(xí)在Python中使用它們。您將涵蓋以下主題:

  • Python中的正則表達(dá)式

  • 基本字符:普通字符

  • 通配符:特殊字符

  • 重復(fù)次數(shù)

  • 使用正則表達(dá)式進(jìn)行分組

  • 貪婪vs非貪婪匹配

  • re Python庫(kù) --- search() 與 match()

Python中的正則表達(dá)式

  • 導(dǎo)入re模塊

在Python中,re模塊支持正則表達(dá)式。使用以下命令導(dǎo)入此模塊:

Import re
  • 基本模式:普通字符

您可以使用普通字符輕松解決Python中的許多基本模式。普通字符是最簡(jiǎn)單的正則表達(dá)式。它們完全匹配,并且在正則表達(dá)式語(yǔ)法中沒(méi)有特殊含義。

示例為" A"," a"," X"," 5"。

普通字符可用于執(zhí)行簡(jiǎn)單的完全匹配:

>>>Import re >>>pattern = r"Cookie" >>>sequence = "Cookie" >>>if re.match(pattern, sequence): >>> print("Match!") >>>else:  >>> print("Not a match!") Match!

match()如果文本與模式匹配,則該函數(shù)返回匹配對(duì)象。否則返回None。

不過(guò),現(xiàn)在讓我們關(guān)注普通字符!您是否注意到r模式的開(kāi)頭Cookie?

這稱(chēng)為原始字符串文字。它更改了字符串文字的解釋方式。這樣的文字會(huì)按其出現(xiàn)時(shí)進(jìn)行存儲(chǔ)。

例如,\當(dāng)前綴為a時(shí)只是一個(gè)反斜杠,r而不是被解釋為轉(zhuǎn)義序列。您將看到帶有特殊字符的含義。有時(shí),語(yǔ)法涉及反斜杠轉(zhuǎn)義的字符,并且為了防止將這些字符解釋為轉(zhuǎn)義序列,請(qǐng)使用原始r前綴。在本示例中,您實(shí)際上并不需要它,但是使用它來(lái)保持一致性是一種很好的做法。

  • 通配符:特殊字符

特殊字符是與正則表達(dá)式不匹配但在正則表達(dá)式中使用時(shí)實(shí)際上具有特殊含義的字符。

最廣泛使用的特殊字符是:

  •  . -匹配除換行符以外的任何單個(gè)字符。

re.search(r'Co.k.e', 'Cookie').group() 'Cookie'

該group()函數(shù)返回與匹配的字符串re。稍后您將更詳細(xì)地看到此功能。

  • \w - 小寫(xiě)w。匹配任何單個(gè)字母,數(shù)字或下劃線。

re.search(r'Co\wk\we', 'Cookie').group() 'Cookie'
  •  \W - 大寫(xiě)w。匹配不屬于\ w的任何字符(小寫(xiě)w)。

re.search(r'C\Wke', 'C@ke').group() 'C@ke'
  • \s - 小寫(xiě)字母s。匹配單個(gè)空格字符,例如:空格,換行符,制表符,返回值。

re.search(r'Eat\scake', 'Eat cake').group() 'Eat cake'
  •  \S - 大寫(xiě)字母s。匹配不屬于\ s(小寫(xiě)s)的任何字符。

re.search(r'Cook\Se', 'Cookie').group() 'Cookie'
  • \t - 小寫(xiě)字母t。匹配標(biāo)簽。

re.search(r'Eat\tcake', 'Eat cake').group() 'Eat\tcake'
  • \n - 小寫(xiě)字母n。匹配換行符。

  • \r - 小寫(xiě)字母r。比賽歸來(lái)。

  • \d - 小寫(xiě)字母d。匹配十進(jìn)制數(shù)字0-9。

re.search(r'c\d\dkie', 'c00kie').group()'c00kie'
  • ^-插入符號(hào) 在字符串的開(kāi)頭匹配一個(gè)模式。

re.search(r'^Eat', 'Eat cake').group()'Eat'
  • $ -匹配字符串末尾的模式。

re.search(r'cake$', 'Eat cake').group() 'cake'

[abc] -匹配a或b或c。

[a-zA-Z0-9]-匹配(a至z)或(A至Z)或(0至9)中的任何字母??梢酝ㄟ^(guò)補(bǔ)充集合來(lái)匹配不在范圍內(nèi)的字符。如果集合的第一個(gè)字符是^,則所有不在集合中的字符都將被匹配。

re.search(r'Number: [0-6]', 'Number: 5').group() 'Number: 5' # Matches any character except 5 re.search(r'Number: [^5]', 'Number: 0').group() 'Number: 0'
  • \A-大寫(xiě)a。僅在字符串開(kāi)頭匹配。也可以跨多行工作。

re.search(r'\A[A-E]ookie', 'Cookie').group() 'Cookie'
  • \b-小寫(xiě)字母b。僅匹配單詞的開(kāi)頭或結(jié)尾。

re.search(r'\b[A-E]ookie', 'Cookie').group() 'Cookie'
  • \-反斜杠。如果反斜杠后面的字符是公認(rèn)的轉(zhuǎn)義字符,則采用該術(shù)語(yǔ)的特殊含義。例如,\n被視為換行符。但是,如果后面的字符\不是可識(shí)別的轉(zhuǎn)義字符,則將\象任何其他字符一樣對(duì)待并通過(guò)。

讓我們看幾個(gè)例子:

# This checks for '\' in the string instead of '\t' due to the '\' used  re.search(r'Back\\stail', 'Back\stail').group() 'Back\\stail' # This treats '\s' as an escape character because it lacks '\' at the start of '\s' re.search(r'Back\stail', 'Back tail').group() 'Back lash'
  • 重復(fù)次數(shù)

如果您要查找序列中的長(zhǎng)模式,將變得非常乏味。幸運(yùn)的是,該re模塊使用以下特殊字符處理重復(fù):

  • + -檢查其左側(cè)的一個(gè)或多個(gè)字符。

re.search(r'Co+kie', 'Cooookie').group() 'Cooookie'
  •  * -檢查左側(cè)是否有零個(gè)或多個(gè)字符。

# Checks for any occurrence of a or o or both in the given sequence re.search(r'Ca*o*kie', 'Caokie').group() 'Caokie'
  •  ? -檢查其左邊是否為零或一個(gè)字符。

# Checks for exactly zero or one occurrence of a or o or both in the given sequence re.search(r'Colou?r', 'Color').group() 'Color'

但是,如果您要檢查序列重復(fù)的確切數(shù)目怎么辦?

例如,檢查應(yīng)用程序中電話號(hào)碼的有效性。re模塊還使用以下正則表達(dá)式很好地處理了此問(wèn)題:

{x} -重復(fù)x次。

{x,} -重復(fù)至少x次或更多。

{x, y} -重復(fù)至少x次,但不超過(guò)y次。

re.search(r'\d{9,10}', '0987654321').group() '0987654321'

將+和*資格賽被認(rèn)為是greedy。

  • 使用正則表達(dá)式進(jìn)行分組和分組

假設(shè),當(dāng)您驗(yàn)證電子郵件地址并想要分別檢查用戶(hù)名和主機(jī)時(shí)。

這是group正則表達(dá)式功能派上用場(chǎng)的時(shí)候。它允許您拾取匹配文本的一部分。

由括號(hào)()界定的正則表達(dá)式模式的部分稱(chēng)為groups。括號(hào)不會(huì)更改表達(dá)式匹配的內(nèi)容,而是在匹配的序列內(nèi)形成組。group()在本教程的示例中,您一直都在使用該功能。match.group()像平常一樣,沒(méi)有任何參數(shù)的純文本仍然是整個(gè)匹配文本。

email_address = 'Please contact us at: support@datacamp.com' match = re.search(r'([\w\.-]+)@([\w\.-]+)', ____________) if _____:  print(match.group()) # The whole matched text  print(match.group(1)) # The username (group 1)  print(match.group(2)) # The host (group 2)

貪婪vs非貪婪匹配

當(dāng)特殊字符與搜索序列(字符串)盡可能匹配時(shí),則稱(chēng)為"貪婪匹配"。這是正則表達(dá)式的正常行為,但有時(shí)不希望出現(xiàn)這種行為:

pattern = "cookie" sequence = "Cake and cookie" heading = r'<h2>TITLE</h2>' re.match(r'<.*>', heading).group() '<h2>TITLE</h2>'

該模式<.*>匹配整個(gè)字符串,直到第二次出現(xiàn)為止>。

但是,如果只想匹配第一個(gè)

標(biāo)記,則可以使用貪婪的限定符*?,該限定符匹配的文字越少越好。

?在限定符之后添加使其以非貪婪或最小的方式執(zhí)行匹配;也就是說(shuō),將匹配盡可能少的字符。跑步時(shí)<.*>,您只會(huì)與比賽<h2>。

heading = r'<h2>TITLE</h2>' re.match(r'<.*?>', heading).group() '<h2>'

re Python庫(kù)

Re  Python中的庫(kù)提供了幾個(gè)函數(shù),使其值得掌握。您已經(jīng)看過(guò)其中的一些,例如re.search(),re.match()。讓我們?cè)敿?xì)檢查一些有用的功能:

search(pattern, string, flags=0)

使用此功能,您可以掃描給定的字符串/序列,以查找正則表達(dá)式產(chǎn)生匹配項(xiàng)的第一個(gè)位置。如果找到,則返回相應(yīng)的匹配對(duì)象;否則,None如果字符串中沒(méi)有位置與模式匹配,則返回。請(qǐng)注意,這None與在字符串中的某個(gè)點(diǎn)找到零長(zhǎng)度匹配不同。

pattern = "cookie" sequence = "Cake and cookie" re.search(pattern, sequence).group() 'cookie'
  • match(pattern, string, flags=0)

如果字符串開(kāi)頭的零個(gè)或多個(gè)字符與模式匹配,則返回相應(yīng)的匹配對(duì)象。否則None,如果字符串與給定的模式不匹配,則返回。

pattern = "C" sequence1 = "IceCream" # No match since "C" is not at the start of "IceCream" re.match(pattern, sequence1) sequence2 = "Cake" re.match(pattern,sequence2).group() 'C'

search() 與 match()

該match()函數(shù)僅在字符串的開(kāi)頭檢查匹配項(xiàng)(默認(rèn)情況下),而該search()函數(shù)在字符串的任何位置檢查匹配項(xiàng)。

  • findall(pattern, string, flags=0)

查找整個(gè)序列中所有可能的匹配項(xiàng),并將它們作為字符串列表返回。每個(gè)返回的字符串代表一個(gè)匹配項(xiàng)。

email_address = "Please contact us at: support@datacamp.com, xyz@datacamp.com" #'addresses' is a list that stores all the possible match addresses = re.findall(r'[\w\.-]+@[\w\.-]+', email_address)for address in addresses:   print(address) support@datacamp.com xyz@datacamp.com
  • sub(pattern, repl, string, count=0, flags=0)

這就是substitute功能。它返回通過(guò)用替換替換或替換字符串中最左邊的非重疊模式所獲得的字符串repl。如果找不到該模式,則該字符串將原樣返回。

email_address = "Please contact us at: xyz@datacamp.com" new_email_address = re.sub(r'([\w\.-]+)@([\w\.-]+)', r'support@datacamp.com', email_address) print(new_email_address) Please contact us at: support@datacamp.com
  • compile(pattern, flags=0)

將正則表達(dá)式模式編譯為正則表達(dá)式對(duì)象。當(dāng)您需要在單個(gè)程序中多次使用表達(dá)式時(shí),使用該compile()函數(shù)保存生成的正則表達(dá)式對(duì)象以供重用會(huì)更有效。這是因?yàn)閏ompile()緩存了傳遞給的最新模式的編譯版本以及模塊級(jí)匹配功能。

pattern = re.compile(r"cookie") sequence = "Cake and cookie" pattern.search(sequence).group() 'cookie' # This is equivalent to: re.search(pattern, sequence).group() 'cookie'

提示:可以通過(guò)指定flags值來(lái)修改表達(dá)式的行為。您可以flag在本教程中看到的各種功能中添加一個(gè)額外的參數(shù)。一些使用的標(biāo)志是:IGNORECASE,DOTALL,MULTILINE,VERBOSE,等。

案例研究:使用正則表達(dá)式

通過(guò)學(xué)習(xí)一些示例,您已經(jīng)了解了正則表達(dá)式在Python中的工作方式,是時(shí)候動(dòng)手了!在本案例研究中,您將運(yùn)用自己的知識(shí)。

import reimport requests the_idiot_url = 'https://www.gutenberg.org/files/2638/2638-0.txt'  def get_book(url):  # Sends a http request to get the text from project Gutenberg  raw = requests.get(url).text  # Discards the metadata from the beginning of the book  start = re.search(r"\*\*\* START OF THIS PROJECT GUTENBERG EBOOK .*\*\*\*",raw ).end()  # Discards the metadata from the end of the book  stop = re.search(r"II", raw).start()  # Keeps the relevant text  text = raw[start:stop]  return text  def preprocess(sentence):   return re.sub('[^A-Za-z0-9.]+' , ' ', sentence).lower()  book = get_book(the_idiot_url) processed_book = preprocess(book) print(processed_book)

在語(yǔ)料庫(kù)中找到代詞" the"的編號(hào)。提示:使用len()功能。

len(re.findall(r'the', processed_book)) 302

嘗試將語(yǔ)料庫(kù)中的每個(gè)" i"的獨(dú)立實(shí)例轉(zhuǎn)換為" I"。確保不要更改一個(gè)單詞中出現(xiàn)的" i":

processed_book = re.sub(r'\si\s', " I ", processed_book) print(processed_book)

查找""語(yǔ)料庫(kù)中有人被引號(hào)()的次數(shù)。

len(re.findall(r'\"', book)) 96

什么是由連接的話'--'在語(yǔ)料庫(kù)?

re.findall(r'[a-zA-Z0-9]*--[a-zA-Z0-9]*', book) ['ironical--it',  'malicious--smile',  'fur--or',  ------------省略  ]

到此,關(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