文章目錄
- 一、[]: 一個字符集合
- 二、{}: 重復次數
- 三、特殊符號
- 四、(): 分組
- 五、python代碼示例
- 六、注意
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
一、[]: 一個字符集合
[]
被稱為字符類,用于定義一個字符集合,匹配該集合中任意一個字符。
在方括號內列出所有可能匹配的字符,正則表達式會匹配方括號中任意一個字符。
特殊符號 | 含義 |
---|---|
- | 來表示一個字符范圍 |
^ | 表示排除方括號中指定的字符,例如:[ ^0-9] 非數字 |
\d | [0-9] |
\D | [^0-9] |
\w | [a-zA-Z0-9_] |
\W | [^a-zA-Z0-9_] |
\s | 匹配任意空白字符,包括空格、制表符、換行符等 |
\S | 匹配任意非空白字符 |
\b | 單詞邊界,匹配單詞的開始或結束位置,例如:\bcat\b 匹配獨立的單詞 cat ,而不會匹配 category 中的 cat |
\B | 非單詞邊界,匹配不在單詞開始或結束的位置,例如:\Bing\B 對于 string 中的 ing 會匹配,而對于 sing 則不匹配 |
二、{}: 重復次數
{}
被稱為量詞,用于指定前面的元素(字符、字符類或分組)出現的次數。
特殊符號 | 含義 |
---|---|
+ | {1, } 1次以上 |
* | {0,} 0次以上 |
? | {0,1} 0次或1次、注:跟在 * 、+ 、{} 等后面時,表示非貪婪匹配 |
. | 匹配任意一個字符(換行除外) |
三、特殊符號
特殊符號 | 含義 |
---|---|
^ | 匹配開始的字符串 |
$ | 匹配結尾的字符串 |
\ | 轉譯符,例如:\. 匹配 . 、\d 匹配任意數字(等價于 [0-9] ) |
| | 或者。例如:[a|b] |
四、(): 分組
- 分組,將多個字符組合成一個整體
- 創建捕獲組,保存匹配內容
- 創建非捕獲組(
(?:)
)- 反向引用(
\數字
)
- 分組,將多個字符組合成一個整體
import re# 匹配連續出現兩次的 "ab"
pattern = r'(ab){2}'
text = 'abababc'
result = re.findall(pattern, text)
print(result) # ['ab']
- 創建捕獲組,保存匹配內容
import re# 匹配日期,格式為 "年-月-日",并捕獲年、月、日
pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = 'Today is 2024-10-15.'
result = re.search(pattern, text)
if result:print("Full match:", result.group(0)) # Full match: 2024-10-15print("Year:", result.group(1)) # Year: 2024print("Month:", result.group(2)) # Month: 10print("Day:", result.group(3)) # Day: 15
- 創建非捕獲組(
(?:)
)
import re# 使用非捕獲組匹配 "abc" 或 "def" 后面跟著一個數字
pattern = r'(?:abc|def)\d'
text = 'abc1 def2 ghi3'
result = re.findall(pattern, text)
print(result) # ['abc1', 'def2']
- 反向引用(
\數字
)
import re# 匹配連續出現兩次相同的單詞
pattern = r'(\b\w+\b)\s+\1'
text = 'hello hello world'
result = re.findall(pattern, text)
print(result) # ['hello']
五、python代碼示例
在Python
中,使用re
模塊來實現正則表達式。
import re
regex = 'a'
string = 'abc'# 1. re.search(regex, string)
# 檢查這個字符串string是否匹配正則表達式
if re.search(regex, string) is not None:print(string) # abc# 2. results = re.findall(regex, string)
# 匹配帶正則表達式的那部分字符串
string = '2014 was a good year, but 2025 will be better!'
years = re.findall('[1-2][0-9]{3}', string)
print(years) # ['2014', '2025']# 3. result.group(0)
# 分組提取,見上面分組
六、注意
正則表達式里使用\
作為轉義字符
假如你需要匹配文本中的字符\
,name編程語言表示的正則表達式需要4個反斜杠\\\\
,前兩個和后兩個分別用于在編程語言中轉義成反斜杠,轉換成兩個反斜杠后再在正則表達式中轉義成一個反斜杠。Python中的原生字符串很好的解決了這個問題,這個例子中的正則表達式可以使用r"\\"
表示。同樣,匹配一個數字的"\\d"
可以寫成r"\d"
,不需要再擔心是否漏寫了反斜杠,寫出來的表達式也更直觀。
import reif re.search("\\\\", "I have one nee\dle") is not None:print("Match")
else:print("Not Match")
import reif re.search(r"\\", "I have one nee\dle") is not None:print("Match")
else:print("Not Match")