一、正則表達式與findall函數
正則表達式是一種用於匹配字元串的強大工具,可以用於字元串的搜索、替換等操作。而在Python中,re模塊提供了對正則表達式的支持。其中,findall函數是re模塊中最常用的函數之一。它能在字元串中查找出所有匹配某個正則表達式的子串,並以列表的形式返回。
import re s = "I have a dream, a song to sing" pattern = "a" result = re.findall(pattern, s) print(result) # ['a', 'a']
在上面的例子中,我們定義了一個字元串s和一個正則表達式pattern,然後調用了re模塊中的findall函數,返回了所有匹配pattern的子串,並以列表的形式返回。在這個例子中,返回的列表為[‘a’, ‘a’],表示字元串s中有兩個字元’a’。
二、findall函數的特點
findall函數具有以下幾個特點:
1、返回所有匹配的子串
findall函數會在字元串中查找所有匹配某個正則表達式的子串,並以列表的形式返回。
import re s = "I have a dream, a song to sing" pattern = "a" result = re.findall(pattern, s) print(result) # ['a', 'a']
2、返回的結果不包含正則表達式中的分組
在正則表達式中,可以使用小括弧來定義一個分組,findall函數會返回所有匹配的子串,但不包含這些分組。
import re s = "I have a dream, a song to sing" pattern = r"(?Pa)(?P[a-z])" result = re.findall(pattern, s) print(result) # [('a', 'h'), ('a', 'o')]
在這個例子中,我們定義了一個正則表達式pattern,使用了兩個分組,其中分別是字元’a’和任意小寫字母。findall函數返回結果為[(‘a’, ‘h’), (‘a’, ‘o’)],只包含匹配的子串,而不包括這兩個分組。
3、返回的結果是字元串中匹配子串的拼接
如果正則表達式中有多個分組,那麼findall函數返回的結果是這些匹配子串的拼接。
import re s = "I have a dream, a song to sing" pattern = r"(a)([a-z])" result = re.findall(pattern, s) print(result) # [('a', 'h'), ('a', 'o')]
在這個例子中,我們修改了正則表達式pattern,將h和o後面的小寫字母放在了一個分組中。函數返回的結果為[(‘a’, ‘h’), (‘a’, ‘o’)],是匹配子串的拼接。可以看到,匹配的子串分別是”ah”和”ao”。
三、findall函數在多行字元串中的應用
除了在普通字元串中應用,findall函數也可以在多行字元串中應用,並且支持使用re.DOTALL和re.MULTILINE來處理多行字元串。
1、處理多行字元串
我們可以使用多行字元串來存儲一篇文章的內容,然後使用findall函數來查找其中包含的其他信息。
import re s = """ Hello, my friend. How are you doing? It is a nice day today. We should go for a walk. Let's have lunch together. How about 12:30pm? """ pattern = r"\d{1,2}:\d{1,2}(am|pm)" result = re.findall(pattern, s) print(result) # ['12:30pm']
在這個例子中,我們定義了一個多行字元串s,其中包含一段對話,其中有一個時間的提醒「12:30pm」。我們使用findall函數和一個正則表達式,來查找這個時間是否在這個對話中出現。函數返回結果為[’12:30pm’]。
2、使用re.DOTALL和re.MULTILINE處理多行字元串
在多行字元串中,可能會出現換行符,這對正則表達式的匹配造成了一定的影響。但是,可以使用re.DOTALL和re.MULTILINE來處理這個問題。
使用re.DOTALL可以將”.”匹配任意單個字元的行為擴展到整個字元串,從而能夠匹配多行字元串。
import re s = """ Hello, my friend. How are you doing? It is a nice day today. We should go for a walk. Let's have lunch together. How about 12:30pm? """ pattern = r"\d{1,2}:\d{1,2}(am|pm)" result = re.findall(pattern, s, re.DOTALL) print(result) # ['12:30pm']
在這個例子中,我們在多行字元串中加入了一個換行符,並且使用re.DOTALL來將”.”匹配擴展到整個字元中,從而能夠正確的匹配出時間。函數返回的結果為[’12:30pm’]。
使用re.MULTILINE可以識別”\n”作為多行字元串中一行的結束,並對”^”和”$”元字元的行為進行擴展,從而能夠正確的匹配多行字元串
import re s = """ Lines may contain up to three words. """ pattern = r"^\w+|\w+$" result = re.findall(pattern, s, re.MULTILINE) print(result) # ['Lines', 'may', 'contain', 'up', 'to', 'three', 'words']
在這個例子中,我們使用re.MULTILINE來擴展”^”和”$”元字元的行為,並且使用正則表達式來匹配每行字元串的開頭和結尾,從而能夠正確地識別出每行中的單詞。函數返回的結果為[‘Lines’, ‘may’, ‘contain’, ‘up’, ‘to’, ‘three’, ‘words’]。
四、findall函數與列表推導式的結合使用
在Python中,我們經常會使用列表推導式的方式來處理列表和字元串等數據類型。而在使用findall函數的時候,也可以結合使用列表推導式的方式,從而更加靈活地處理數據。
1、使用列表推導式篩選數據
使用findall函數和列表推導式的結合,可以幫助我們更加靈活地篩選出需要的數據。
import re s = "I have 10 apples, 20 oranges and 30 grapes" pattern = r"\d+" result = [int(x) for x in re.findall(pattern, s)] print(result) # [10, 20, 30]
在這個例子中,我們使用正則表達式來匹配字元串s中的數字,findall函數返回結果為[’10’, ’20’, ’30’],然後使用列表推導式和int函數來將這些字元串轉化為數字,從而得到我們需要的結果[10, 20, 30]。
2、使用列表推導式處理字元串
除了篩選數據之外,還可以使用列表推導式和findall函數來處理字元串,例如將字元串中的某些字元替換掉。
import re s = "hello, world!" pattern = r"[aeiou]" result = "".join(["*" if c in re.findall(pattern, s) else c for c in s]) print(result) # h*ll*, w*rld!
在這個例子中,我們使用正則表達式來匹配字元串s中的母音字母,findall函數返回結果為[‘e’, ‘o’],然後使用列表推導式和if語句,將這些母音字母替換為”*”,最後使用join函數將所有字元拼接起來形成新的字元串”h*ll*, w*rld!”。
原創文章,作者:TDVJI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/349439.html