柚子快報(bào)邀請(qǐng)碼778899分享:mysql 正則表達(dá)式
柚子快報(bào)邀請(qǐng)碼778899分享:mysql 正則表達(dá)式
正則表達(dá)式(Regular Expression,簡(jiǎn)稱 regex 或 regexp)是用于匹配字符串的一種模式表達(dá)式,常用于文本搜索、替換、提取等任務(wù)。下面介紹正則表達(dá)式的常用方法及其典型應(yīng)用。
一、正則表達(dá)式字符
正則表達(dá)式中的字符主要分為 普通字符 和 特殊字符(元字符)。下面將對(duì)這兩類(lèi)字符分別進(jìn)行詳細(xì)解釋。
1. 普通字符
普通字符就是那些在正則表達(dá)式中沒(méi)有特殊意義的字符,它們表示字面上的含義,直接匹配字符串中的這些字符本身。
常見(jiàn)的普通字符:
字母:如 a、b、c 等,直接匹配對(duì)應(yīng)的字母。數(shù)字:如 0、1、2 等,直接匹配對(duì)應(yīng)的數(shù)字。標(biāo)點(diǎn)符號(hào):如 ,、!、@ 等,如果它們沒(méi)有在元字符列表中,直接匹配這些符號(hào)。其他字符:例如空格、下劃線 _、加號(hào) + 等,通常也被視為普通字符,除非它們出現(xiàn)在特定的上下文中。
2. 特殊字符(元字符)
元字符在正則表達(dá)式中具有特殊的含義,控制匹配行為。要匹配元字符的字面含義,需要對(duì)其進(jìn)行轉(zhuǎn)義,即在其前面加上反斜杠 \。
常見(jiàn)的元字符及其含義:
元字符含義舉例.匹配除換行符外的任何單個(gè)字符a.b 可以匹配 aab、acb、a1b 等,但不能匹配 ab^匹配字符串的開(kāi)頭^abc 只匹配以 abc 開(kāi)頭的字符串,如 abc123$匹配字符串的結(jié)尾xyz$ 只匹配以 xyz 結(jié)尾的字符串,如 123xyz*匹配前一個(gè)字符 0 次或多次(貪婪匹配)ab*c 可以匹配 ac、abc、abbc、abbbc 等+匹配前一個(gè)字符 1 次或多次(貪婪匹配)ab+c 可以匹配 abc、abbc、abbbc,但不匹配 ac(因?yàn)橹辽傩枰粋€(gè) b)?匹配前一個(gè)字符 0 次或 1 次(可選項(xiàng))或使量詞變?yōu)榉秦澙纺J絚olou?r 可以匹配 color 和 colour{}限定前一個(gè)字符出現(xiàn)的次數(shù) {m} 或出現(xiàn)的范圍 {m,n}a{2,4} 匹配2到4個(gè)連續(xù)的 a,如 aa、aaa、aaaa[]字符類(lèi),匹配方括號(hào)中的任意一個(gè)字符[abc] 匹配 a、b 或 c``或運(yùn)算符,匹配其左右兩邊的任意一個(gè)表達(dá)式()捕獲組,分組子表達(dá)式,并捕獲匹配到的文本(abc)+ 匹配 abc、abcabc 等\轉(zhuǎn)義符,用于轉(zhuǎn)義元字符或表示特殊序列(如 \d 表示數(shù)字). 可以匹配點(diǎn)號(hào) .,因?yàn)?. 本身是元字符,轉(zhuǎn)義后才能表示真正的點(diǎn)號(hào)
常見(jiàn)的轉(zhuǎn)義字符和特殊序列:
轉(zhuǎn)義字符/特殊序列含義\d匹配任何數(shù)字字符(等同于 [0-9])\D匹配任何非數(shù)字字符(等同于 [^0-9])\w匹配任何字母、數(shù)字或下劃線(等同于 [A-Za-z0-9_])\W匹配任何非字母、數(shù)字或下劃線字符(等同于 [^A-Za-z0-9_])\s匹配任何空白字符(空格、制表符、換行符等)\S匹配任何非空白字符\b匹配單詞邊界\B匹配非單詞邊界\t匹配制表符\n匹配換行符\r匹配回車(chē)符\f匹配換頁(yè)符
3. 字符類(lèi)
字符類(lèi)用方括號(hào) [] 表示,表示匹配括號(hào)內(nèi)任意一個(gè)字符??梢允褂眠B字符 - 表示字符范圍。
示例:
[abc]:匹配 a、b 或 c。[a-z]:匹配所有小寫(xiě)字母。[A-Z]:匹配所有大寫(xiě)字母。[0-9]:匹配所有數(shù)字。[^abc]:匹配除 a、b、c 以外的任意字符(注意方括號(hào)中的 ^ 表示取反)。
4. 量詞
量詞用于指定前一個(gè)字符或子表達(dá)式的重復(fù)次數(shù)。
量詞含義*匹配前面的字符 0 次或多次+匹配前面的字符 1 次或多次?匹配前面的字符 0 次或 1 次{n}匹配前面的字符恰好 n 次{n,}匹配前面的字符至少 n 次{n,m}匹配前面的字符至少 n 次,最多 m 次
5. 錨點(diǎn)
錨點(diǎn)用于匹配文本中的特定位置,而不是字符。
^:匹配字符串的開(kāi)頭。$:匹配字符串的結(jié)尾。\b:匹配單詞的邊界。\B:匹配非單詞邊界。
二、正則表達(dá)式用法
1. 基本用法:匹配與查找
在編程語(yǔ)言中使用正則表達(dá)式時(shí),通常會(huì)使用一些專門(mén)的函數(shù)或方法來(lái)處理正則表達(dá)式。以 Python 中的 re 模塊為例:
基本函數(shù):
re.match():從字符串的開(kāi)頭開(kāi)始匹配,若匹配成功,返回 Match 對(duì)象;否則返回 None。re.search():在整個(gè)字符串中搜索,返回第一次成功匹配的 Match 對(duì)象;否則返回 None。re.findall():返回所有匹配的子串,以列表形式輸出。re.finditer():返回所有匹配子串的迭代器,每個(gè)匹配都包含 Match 對(duì)象。re.sub():用于替換匹配到的字符串。re.split():按正則表達(dá)式分割字符串。
示例:
import re
# 示例字符串
text = "There are 3 apples and 5 oranges."
pattern = r"\d+"
# 1. re.match() 示例:匹配字符串開(kāi)頭
result = re.match(r"There", text)
print(result.group()) # 輸出 'There'
# 2. re.search() 示例:查找字符串中的第一個(gè)數(shù)字
result = re.search(pattern, text)
print(result.group()) # 輸出 '3'
# 3. re.findall() 示例:查找所有數(shù)字
phones = re.findall(pattern, text)
print(phones) # 輸出 ['3', '5']
# 4. re.sub() 示例:替換數(shù)字為 [NUM]
redacted_text = re.sub(pattern, "[NUM]", text)
print(redacted_text) # 輸出 'There are [NUM] apples and [NUM] oranges.'
# 5. re.split() 示例:按空白字符分割字符串
result = re.split(r"\s+", text)
print(result) # 輸出 ['There', 'are', '3', 'apples', 'and', '5', 'oranges.']
三、Match對(duì)象
Match 對(duì)象是 Python 正則表達(dá)式庫(kù) re 中返回的一個(gè)結(jié)果對(duì)象,當(dāng)使用 re.match()、re.search() 或 re.finditer() 成功匹配字符串時(shí),返回的就是這個(gè)對(duì)象。Match 對(duì)象包含了有關(guān)匹配結(jié)果的各種信息,并提供了一些方法和屬性來(lái)訪問(wèn)匹配的內(nèi)容和位置。
Match 對(duì)象的常用方法和屬性
1. group():獲取匹配的內(nèi)容
group(0) 或 group():返回整個(gè)匹配的字符串。group(n):返回第 n 個(gè)捕獲組的匹配內(nèi)容。使用括號(hào) () 創(chuàng)建捕獲組,group(1) 返回第一個(gè)捕獲組,group(2) 返回第二個(gè)捕獲組,以此類(lèi)推。
import re
text = "My phone number is 123-456-7890."
pattern = r'(\d{3})-(\d{3})-(\d{4})'
match = re.search(pattern, text)
if match:
print(match.group(0)) # 輸出 '123-456-7890',整個(gè)匹配的字符串
print(match.group(1)) # 輸出 '123',第一個(gè)捕獲組
print(match.group(2)) # 輸出 '456',第二個(gè)捕獲組
print(match.group(3)) # 輸出 '7890',第三個(gè)捕獲組
2. groups():獲取所有捕獲組的元組
返回一個(gè)包含所有捕獲組的元組(不包含 group(0),即整個(gè)匹配)。
import re
text = "Date: 2024-09-18"
pattern = r"(\d{4})-(\d{2})-(\d{2})"
match = re.search(pattern, text)
if match:
print(match.groups()) # 輸出 ('2024', '09', '18')
3. 命名捕獲組
使用命名捕獲組可以給捕獲的內(nèi)容命名,便于后續(xù)引用。
import re
text = "Order number: 12345, Date: 2024-01-01"
pattern = r"Order number: (?P
match = re.search(pattern, text)
print(match.group("order")) # 輸出 '12345'
print(match.group("date")) # 輸出 '2024-01-01'
具體解釋:
Order number: :匹配字符串的開(kāi)頭部分,要求它包含 Order number: 這個(gè)固定的文本。 (?P
(?P
(?P
整個(gè)正則表達(dá)式模式匹配的字符串結(jié)構(gòu)是:
Order number: 12345, Date: 2024-01-01
4. groupdict():返回命名捕獲組的字典
如果正則表達(dá)式中使用了命名捕獲組(通過(guò) (?P
import re
text = "Order number: 12345, Date: 2024-09-18"
pattern = r"Order number: (?P
match = re.search(pattern, text)
if match:
print(match.groupdict()) # 輸出 {'order': '12345', 'date': '2024-09-18'}
5. start() 和 end():匹配位置
start():返回匹配到的字符串在原始字符串中的起始位置。end():返回匹配到的字符串在原始字符串中的結(jié)束位置。
import re
text = "My phone number is 123-456-7890."
pattern = r'\d{3}-\d{3}-\d{4}'
match = re.search(pattern, text)
if match:
print(match.start()) # 輸出 19,匹配到的字符串開(kāi)始的位置
print(match.end()) # 輸出 31,匹配到的字符串結(jié)束的位置
6. span():返回匹配的起始和結(jié)束位置
返回一個(gè)元組,包含匹配到的字符串的起始位置和結(jié)束位置。
import re
text = "My phone number is 123-456-7890."
pattern = r'\d{3}-\d{3}-\d{4}'
match = re.search(pattern, text)
if match:
print(match.span()) # 輸出 (19, 31),匹配到的字符串在原始字符串中的起止位置
7. pos 和 endpos:匹配范圍的起始和結(jié)束位置
pos:匹配的開(kāi)始位置(搜索時(shí)傳遞給函數(shù)的起始位置)。endpos:匹配的結(jié)束位置(搜索時(shí)傳遞給函數(shù)的結(jié)束位置)。
import re
text = "My phone number is 123-456-7890."
pattern = r'\d{3}-\d{3}-\d{4}'
match = re.search(pattern, text)
if match:
print(match.pos) # 輸出 0,匹配搜索的起始位置
print(match.endpos) # 輸出 31,匹配搜索的結(jié)束位置
8. re:返回使用的正則表達(dá)式
re 屬性返回編譯的正則表達(dá)式對(duì)象。
import re
pattern = r'\d{3}-\d{3}-\d{4}'
match = re.search(pattern, "My phone number is 123-456-7890.")
if match:
print(match.re) # 輸出 re.compile('\\d{3}-\\d{3}-\\d{4}')
9. string:返回匹配的字符串
string 屬性返回進(jìn)行匹配的原始字符串。
import re
pattern = r'\d{3}-\d{3}-\d{4}'
match = re.search(pattern, "My phone number is 123-456-7890.")
if match:
print(match.string) # 輸出 'My phone number is 123-456-7890.'
四、re.compile()
在 Python 中,re.compile() 是用于編譯正則表達(dá)式的函數(shù)。它將一個(gè)正則表達(dá)式字符串編譯成一個(gè)正則表達(dá)式對(duì)象,這個(gè)對(duì)象可以用于多次執(zhí)行匹配操作,提升性能并簡(jiǎn)化代碼結(jié)構(gòu)。
使用 re.compile() 的好處:
提高性能:當(dāng)你在代碼中需要多次使用同一個(gè)正則表達(dá)式時(shí),使用 re.compile() 預(yù)先編譯正則表達(dá)式可以提高效率,避免重復(fù)解析正則表達(dá)式。代碼結(jié)構(gòu)清晰:將正則表達(dá)式編譯成對(duì)象后,能夠使代碼邏輯更清晰,特別是需要多次使用相同正則表達(dá)式時(shí)。
語(yǔ)法:
pattern = re.compile(r'正則表達(dá)式', flags)
pattern:表示編譯后的正則表達(dá)式對(duì)象。r'正則表達(dá)式':待編譯的正則表達(dá)式字符串,通常使用原始字符串(r'')來(lái)防止轉(zhuǎn)義字符的問(wèn)題。flags:可選參數(shù),用于指定匹配行為的標(biāo)志(如忽略大小寫(xiě)、支持多行等)。常見(jiàn)標(biāo)志包括:
re.IGNORECASE (re.I):忽略大小寫(xiě)匹配。re.MULTILINE (re.M):多行模式,讓 ^ 和 $ 匹配每一行的開(kāi)頭和結(jié)尾。re.DOTALL (re.S):使 . 匹配所有字符,包括換行符。
示例:
1. 使用 re.compile() 編譯正則表達(dá)式:
import re
# 編譯一個(gè)匹配電子郵件的正則表達(dá)式
email_pattern = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
# 使用編譯后的模式多次匹配不同的字符串
email1 = "user1@example.com"
email2 = "user2@domain.org"
# 使用 compiled 正則表達(dá)式對(duì)象的 match() 方法
print(email_pattern.match(email1)) # 輸出
print(email_pattern.match(email2)) # 輸出
2. 編譯后進(jìn)行多次操作:
import re
# 編譯一個(gè)匹配數(shù)字的正則表達(dá)式
number_pattern = re.compile(r'\d+')
text = "There are 123 apples and 456 oranges."
# 使用 compiled 正則表達(dá)式對(duì)象的 findall() 方法
numbers = number_pattern.findall(text)
print(numbers) # 輸出 ['123', '456']
3. 使用標(biāo)志參數(shù):
import re
# 編譯一個(gè)忽略大小寫(xiě)的正則表達(dá)式
pattern = re.compile(r'hello', re.IGNORECASE)
text1 = "Hello World"
text2 = "hello world"
# 匹配忽略大小寫(xiě)的字符串
print(pattern.search(text1)) # 輸出
print(pattern.search(text2)) # 輸出
五、非貪婪匹配
默認(rèn)情況下,正則表達(dá)式是貪婪匹配的,即盡可能多地匹配字符??梢酝ㄟ^(guò)在量詞后面加 ? 來(lái)進(jìn)行非貪婪匹配。
text = "
greedy_pattern = r"<.*>" # 貪婪匹配
non_greedy_pattern = r"<.*?>" # 非貪婪匹配
# 貪婪匹配:會(huì)匹配整個(gè)字符串,因?yàn)樗鼑L試匹配盡可能多的字符
print(re.search(greedy_pattern, text).group()) # 輸出 '
# 非貪婪匹配:會(huì)匹配到第一個(gè)閉合標(biāo)簽
print(re.search(non_greedy_pattern, text).group()) # 輸出 ''
柚子快報(bào)邀請(qǐng)碼778899分享:mysql 正則表達(dá)式
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。