在我們平時的工作和學習中,常常需要對字元串進行處理。而正則表達式則是一種強大的字元串匹配工具,可以用於字元串的查找、替換、截取等操作。
一、正則表達式基礎
正則表達式是由一系列字元和特殊字元組成的模式,用於描述字元串的特徵。常用的正則表達式元字元有:
.
:匹配除換行符以外的任意字元\d
:匹配數字字元,也可以用[0-9]
表示\w
:匹配字母、數字和下劃線,也可以用[a-zA-Z0-9_]
表示\s
:匹配空白字元,包括空格、製表符、換行符等[]
:用於指定匹配的字符集合,比如[aeiou]
匹配母音字母^
:匹配開頭,比如^hello
匹配以hello開頭的字元串$
:匹配結尾,比如world$
匹配以world結尾的字元串*
:匹配任意次,包括0次+
:匹配至少一次?
:匹配0次或1次{m,n}
:匹配m至n次,包括m和n
下面是一個簡單的示例,利用正則表達式匹配出一個字元串中的數字:
import re
str = 'There are 3 apples and 5 oranges.'
pattern = r'\d+'
result = re.findall(pattern, str)
print(result) # ['3', '5']
以上代碼使用\d+
這個正則表達式模式來查找字元串中的數字,並返回一個列表。如果使用re.search()
函數,則會返回第一個匹配的結果。
二、正則表達式高級應用
正則表達式不僅可以用來進行基本的匹配,還可以進行分組、反向引用、零寬斷言等高級操作。
1. 分組
分組可以將正則表達式中的一部分提取出來,方便後續對其進行操作。分組使用圓括弧()
進行表示。比如匹配一段文本中的中英文名字:
import re
text = 'My name is Jack, 你叫什麼名字?'
pattern = r'My name is (\w+), (.+)\?'
match = re.search(pattern, text)
if match:
print('My name is', match.group(1))
print('What is your name?', match.group(2))
以上代碼中,(\w+)
表示將英文名字進行分組,(.+)
表示將中文名字進行分組,然後使用match.group()
方法獲取分組結果。
2. 反向引用
反向引用可以在正則表達式中引用前面的分組結果。它使用\數字
或(?P<name>)
進行表示,其中\<數字>
表示引用數字代表的分組結果,(?P<name>)
則可以為分組指定一個名字。
比如,使用正則表達式尋找重複的單詞:
import re
text = 'I like coding, coding is fun. What do you like?'
pattern = r'\b(\w+)\b\s+\1\b'
matches = re.findall(pattern, text)
print(matches) # ['coding']
以上代碼中,(\w+)
將一個單詞進行分組,\s+匹配任意長度的空格,\1
則表示引用前面的分組結果。它的含義是,匹配重複的單詞,即兩個相同的單詞之間有任意長度的空格。
3. 零寬斷言
零寬斷言是指在匹配字元串的時候,只匹配符合某種條件的字元串,而不將該條件字元串包含其中。常用的零寬斷言有:正向先行斷言(?=pattern)
、正向後行斷言(?<=pattern)
、負向先行斷言(?!pattern)
和負向後行斷言(?<!pattern)
。
比如,判斷一個字元串是否包含數字和字母:
import re
text = 'abc123'
pattern1 = r'(?=.*\d)(?=.*[a-zA-Z])'
pattern2 = r'[a-zA-Z0-9]{6,}'
match1 = re.search(pattern1, text)
match2 = re.search(pattern2, text)
if match1 and match2:
print('The text contains letters and numbers.')
以上代碼中,(?=.*\d)
和(?=.*[a-zA-Z])
分別表示要求字元串中包含數字和字母,[a-zA-Z0-9]{6,}
則表示要求字元串中至少有6個字母和數字。
三、應用實例
正則表達式可以應用於很多場景,比如爬蟲、文本處理、數據清洗等。下面是一些常見的應用實例。
1. 爬蟲
在爬蟲中,我們需要從網頁中提取有用的信息,又需要快速、準確地將無用信息濾掉。正則表達式可以幫助我們完成這個任務。
import re
import requests
url = 'https://www.baidu.com'
html = requests.get(url).text
pattern = r''
result = re.findall(pattern, html)
for link in result:
print(link)
以上代碼中,<a href="(https?:\/\/.*?)".*?>
表示匹配所有標籤中的URL。這樣我們就可以從網頁中提取出所有的鏈接。
2. 文本處理
正則表達式在文本處理中的應用也是非常廣泛的。比如,在處理日誌文件時,我們需要將其中的IP地址進行提取,正則表達式可以輕鬆實現。
import re
log = '127.0.0.1 - - [01/May/2022:08:34:12 +0800] "GET / HTTP/1.1" 200 1234'
pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
result = re.search(pattern, log)
if result:
print(result.group())
以上代碼中,\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
可以匹配IP地址。正則表達式可以解決很多文本處理問題,大大提高了工作效率。
3. 數據清洗
在數據清洗中,正則表達式也扮演著重要的角色。比如,在清洗電話號碼數據時,我們可以使用正則表達式將格式不正確的號碼過濾掉或者進行格式轉換。
import re
phone = '0086-13812345678'
pattern1 = r'^\d{1,4}-\d{7,8}$'
pattern2 = r'^0086-(\d{11})$'
if re.match(pattern1, phone):
print('The phone number is in the correct format.')
match = re.match(pattern2, phone)
if match:
print('The corrected phone number is +86-', match.group(1))
以上代碼中,^\d{1,4}-\d{7,8}$
表示匹配以區號開頭,後接7位或8位號碼的電話號碼格式。而^0086-(\d{11})$
則表示將0086開頭的電話號碼轉換成+86-XXXXXXXXXXX的格式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248692.html