正則表達式是一種強大的文本模式匹配工具,常用於字元串的匹配、替換、分割等操作。Python內置re模塊提供了豐富的正則表達式方法。但是,正則表達式中有許多特殊字元需要特殊處理,掌握這些特殊字元對於使用正則表達式是非常重要的。
一、元字元
元字元是正則表達式中最基本的概念。Python中最常用的元字元包括:.、^、$、*、+、?、{}、|、[]、()。下面我們詳細說明這些元字元。
. (點號)
點號可以匹配任意單個字元,但是不能匹配換行符(\n)。例如,正則表達式 a.b 可以匹配字元串 “acb”、”a2b”、”a#b” 等,但不能匹配 “a
b”。
^ (脫字元)
脫字元匹配字元串的開頭。例如,正則表達式 ^a 匹配以字母 a 開頭的字元串,但是不能匹配 aaaaaa。
$ (美元符號)
美元符號匹配字元串的結尾。例如,正則表達式 a$ 匹配以字母 a 結尾的字元串,但是不能匹配 aaaaaa。
* (星號)
星號表示匹配前面的字元0次或多次。例如,正則表達式 a*b 可以匹配 “b”、”ab”、”aab” 等字元串。
+ (加號)
加號表示匹配前面的字元1次或多次。例如,正則表達式 a+b 可以匹配 “ab”、”aab” 等字元串,但是不能匹配字元串 “b”。
? (問號)
問號表示匹配前面的字元0次或1次。例如,正則表達式 a?b 可以匹配 “b” 和 “ab”兩個字元串。
{m,n}
大括弧表示匹配前面的字元m次到n次(包括m和n)。例如,正則表達式 a{2,4}b 可以匹配 “aab”、”aaab”、”aaaab” 三個字元串。
| (管道符號)
管道符號表示「或」關係。例如,正則表達式 a|b 可以匹配 “a” 或 “b”。
[] (字符集)
字符集表示匹配方括弧中任意一個字元。例如,正則表達式 [abc] 表示匹配字元 “a”、”b” 或 “c”。
() (分組)
圓括弧表示將其中的字元看成一個整體,可以在其中使用|、*、+、?、{}等元字元。例如,正則表達式 (ab)+ 可以匹配 “ab”、”abab”、”ababab” 等字元串。
二、轉義字元
在正則表達式中,有些特殊字元需要用反斜杠進行轉義才能正確匹配。Python中最常用的轉義字元包括:\d、\D、\s、\S、\w、\W、\b、\B、\\。
\d
\d 表示匹配所有數字。例如,正則表達式 \d+ 可以匹配任意一個數字串。
\D
\D 表示匹配所有非數字字元。例如,正則表達式 \D+ 可以匹配任意一個非數字串。
\s
\s 表示匹配所有空白字元,包括空格、製表符、換行符等。例如,正則表達式 \s+ 可以匹配任意一個空白符串。
\S
\S 表示匹配所有非空白字元。例如,正則表達式 \S+ 可以匹配任意一個非空白符串。
\w
\w 表示匹配所有字母、數字和下劃線。例如,正則表達式 \w+ 可以匹配任意一個標識符。
\W
\W 表示匹配所有非字母、數字和下劃線的字元。例如,正則表達式 \W+ 可以匹配任意一個非標識符。
\b
\b 表示匹配單詞的邊界。例如,正則表達式\b\w+\b 可以匹配任意一個單詞。
\B
\B 表示匹配非單詞邊界。例如,正則表達式\Bcat\B 可以匹配 “concat”、”cat123” 等字元串。
\\
用於轉義字元本身。例如,正則表達式 \\+ 可以匹配一個反斜杠。
三、貪婪匹配和非貪婪匹配
正則表達式中的元字元默認是「貪婪」的,即儘可能多地匹配字元。例如,正則表達式 A.*B 可以匹配字元串 “A1B2C3D4B” 中的 A1B2C3D4。
非貪婪匹配也稱為懶惰匹配或最小匹配,即儘可能少地匹配字元。在貪婪匹配的元字元後面加上?即可實現非貪婪匹配。例如,正則表達式 A.*?B 可以匹配字元串 “A1B2C3D4B” 中的 A1B2。
四、示例代碼
import re # 元字元示例 pattern = "a.b" print(re.match(pattern, "acb")) # 匹配成功 print(re.match(pattern, "a
b")) # 匹配失敗 pattern = "^a" print(re.match(pattern, "abcd")) # 匹配成功 print(re.match(pattern, "bcda")) # 匹配失敗 pattern = "a$" print(re.match(pattern, "abcd")) # 匹配失敗 print(re.match(pattern, "bcda")) # 匹配成功 pattern = "a*b" print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "abab")) # 匹配成功 print(re.match(pattern, "c")) # 匹配失敗 pattern = "a+b" print(re.match(pattern, "ab")) # 匹配成功 print(re.match(pattern, "aab")) # 匹配成功 print(re.match(pattern, "b")) # 匹配失敗 pattern = "a?b" print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "ab")) # 匹配成功 print(re.match(pattern, "ac")) # 匹配失敗 pattern = "a{2,4}b" print(re.match(pattern, "aab")) # 匹配成功 print(re.match(pattern, "aaab")) # 匹配成功 print(re.match(pattern, "aaaab")) # 匹配成功 print(re.match(pattern, "ab")) # 匹配失敗 pattern = "a|b" print(re.match(pattern, "a")) # 匹配成功 print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "c")) # 匹配失敗 pattern = "[abc]" print(re.match(pattern, "a")) # 匹配成功 print(re.match(pattern, "b")) # 匹配成功 print(re.match(pattern, "d")) # 匹配失敗 pattern = "(ab)+" print(re.match(pattern, "ababab")) # 匹配成功 print(re.match(pattern, "ab")) # 匹配成功 print(re.match(pattern, "ac")) # 匹配失敗 # 轉義字元示例 pattern = "\d+" print(re.match(pattern, "123abc")) # 匹配成功 print(re.match(pattern, "abc")) # 匹配失敗 pattern = "\D+" print(re.match(pattern, "123abc")) # 匹配失敗 print(re.match(pattern, "abc")) # 匹配成功 pattern = "\s+" print(re.match(pattern, " abc")) # 匹配成功 print(re.match(pattern, "abc")) # 匹配失敗 pattern = "\S+" print(re.match(pattern, " abc")) # 匹配失敗 print(re.match(pattern, "abc")) # 匹配成功 pattern = "\w+" print(re.match(pattern, "def_123")) # 匹配成功 print(re.match(pattern, "!@#")) # 匹配失敗 pattern = "\W+" print(re.match(pattern, "def_123")) # 匹配失敗 print(re.match(pattern, "!@#")) # 匹配成功 pattern = r"\b\w+\b" print(re.findall(pattern, "Hello, world!")) # ['Hello', 'world'] pattern = r"\Bcat\B" print(re.search(pattern, "concat")) # None print(re.search(pattern, "cat123")) # None # 貪婪匹配和非貪婪匹配示例 pattern = "A.*B" print(re.match(pattern, "A1B2C3D4B")) # 匹配成功 pattern = "A.*?B" print(re.match(pattern, "A1B2C3D4B")) # 匹配成功
原創文章,作者:TDLP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138823.html