當使用正則表達式(Regular Expressions, Regex)時,不同的符號和構造具有特定的含義,這些符號和模式可以用來構建靈活且強大的文本匹配規則。
字元類別 (Character Classes)
[abc]
: 匹配a
、b
或c
中的任何一個字符。[^abc]
: 匹配除了a
、b
、c
之外的任何字符(否定字符集)。[a-z]
: 匹配任意小寫字母(a到z)。[A-Z]
: 匹配任意大寫字母(A到Z)。[0-9]
: 匹配任意數字(0到9)。[a-zA-Z0-9_]
: 匹配任意字母、數字或下劃線(單詞字符)。\d
: 匹配任意數字,等同於[0-9]
。\D
: 匹配任意非數字字符,等同於[^0-9]
。\w
: 匹配任意單詞字符(字母、數字或下劃線),等同於[a-zA-Z0-9_]
。\W
: 匹配任意非單詞字符,等同於[^a-zA-Z0-9_]
。\s
: 匹配任意空白字符(空格、Tab、換行等),等同於[ \t\n\r\f\v]
。\S
: 匹配任意非空白字符,等同於[^ \t\n\r\f\v]
。.
: 匹配除換行符外的任何單個字符。
量詞 (Quantifiers)
*
: 匹配前面的元素0次或多次(零個或多個)。+
: 匹配前面的元素1次或多次(至少一個)。?
: 匹配前面的元素0次或1次(可選)。{n}
: 精確匹配前面的元素n
次。{n,}
: 匹配前面的元素至少n
次。{n,m}
: 匹配前面的元素至少n
次,最多m
次。
位置匹配符號 (Anchors)
^
: 匹配字符串的開頭。$
: 匹配字符串的結尾。\b
: 匹配單詞邊界(單詞的開始或結束)。\B
: 匹配非單詞邊界。
分組和引用 (Grouping and References)
(...)
: 分組,將正則表達式的一部分包起來,並將其視為一個單位。分組的部分可以被捕獲和引用。(?:...)
: 非捕獲組,分組但不存儲匹配結果。\1
,\2
, ...: 捕獲組的反向引用,匹配先前分組中捕獲的內容。
特殊字符 (Special Characters) 的轉義
\
: 用來轉義正則表達式中的特殊字符(如.
、*
、+
、?
、^
、$
等),使它們作為普通字符處理。
選擇符 (Alternation)
|
: 表示邏輯 "或",例如a|b
匹配a
或b
。
特殊語法 (Special Constructs)
(?i)
: 使匹配忽略大小寫。(?m)
: 多行模式,使^
和$
匹配每一行的開頭和結尾。(?s)
: 使.
匹配所有字符,包括換行符。(?=...)
: 正向先行斷言,要求在此位置後面的字符串與括號內的模式匹配,但不消耗字符。(?!...)
: 負向先行斷言,要求在此位置後面的字符串不匹配括號內的模式。(?<=...)
: 正向後行斷言,要求在此位置前面的字符串與括號內的模式匹配,但不消耗字符。(?<!...)
: 負向後行斷言,要求在此位置前面的字符串不匹配括號內的模式。
貪婪與非貪婪匹配 (Greedy vs Non-Greedy Matching)
.*
: 貪婪匹配,匹配儘可能多的字符。.*?
: 非貪婪匹配,匹配儘可能少的字符。
範例
數字匹配(包括小數)
number_pattern = r'[-+]?\d*\.?\d+'
[-+]?
: 匹配可選的正號 (+
) 或負號 (-
)。\d*
: 匹配零個或多個數字,代表小數點前的整數部分。\.?
: 匹配可選的小數點 (.
)。\d+
: 匹配一個或多個數字,代表小數部分或整數部分。
number_pattern = r'[-+]?\d*\.?\d+'
number = "-123.45"
number_match = re.match(number_pattern, number)
if number_match:
print("數字匹配結果:", number_match.group()) #輸出 數字匹配結果: -123.45
除了正則表達式(regex),還有一些其他方法可以用來處理字符串匹配、查找和替換的任務。
String Methods
Pandas
List Comprehensions
String Templates
但在處理複雜模式匹配時,re正則表達式還是很好用的工具可以客製