一、基本簡介:
1. 定義:即文字的高階匹配模式,提供搜尋,替換等功能。其本質是由一系列字元和特殊符號構成的字串,這個字串即正規表示式。
2. 原理:通過普通字元和有特定含義的字元,來組成字串,用以描述一定的字串規則,比如:重複,位置等,來表達某類特定的字串,進而匹配。
3. 目標
熟練掌握正規表示式元字元
能夠讀懂常用正規表示式,編輯簡單的正則規則
能夠熟練使用re模組操作正規表示式
二、元字元使用:
1.普通字元:
匹配規則:每個普通字元匹配其對應的字元
例子:re.findall('ab',"abcdefabcd")
# ['ab', 'ab']
注意事項:正規表示式在python中也可以匹配中文
2.元字元:| (或關係)
匹配規則:匹配 | 兩側任意的正規表示式即可
例子:re.findall('com|cn',"www.baidu.com/www.tmooc.cn")
#['com', 'cn']
3.元字元:. (匹配單個元字元)
匹配規則:匹配除換行外的任意乙個字元
例子:re.findall('張.豐',"張三丰,張四豐,張五豐")
# ['張三丰', '張四豐', '張五豐']
4.元字元: [字符集]
匹配規則: 匹配字符集中的任意乙個字元
表達形式:
[abc#!好] 表示 中的任意乙個字元
[0-9],[a-z],[a-z] 表示區間內的任意乙個字元
[_#?0-9a-z] 混合書寫,一般區間表達寫在後面
例子:re.findall('[aeiou]',"how are you!")
# ['o', 'a', 'e', 'o', 'u']
5.元字元:[^字符集] (匹配反字符集)
匹配規則:匹配除了字符集以外的任意乙個字元
例子:re.findall('[^0-9]',"use 007 port")
#['u', 's', 'e', ' ', ' ', 'p', 'o', 'r', 't']
6.元字元:^ \a
匹配規則:匹配字串開始位置
例子:re.findall('^jame',"jame,hello")
#['jame']
7.元字元:$ \z
匹配規則:匹配目標字串的結尾位置
例子:re.findall('jame$',"hi,jame")
#['jame']
規則技巧: ^ 和 $必然出現在正規表示式的開頭和結尾處。如果兩者同時出現,則中間的部分必須匹配整個目標字串的全部內容。
8.元字元:*
匹配規則:匹配前面的字元出現0次或多次
例子:re.findall('wo*',"wooooo~~w!")
#['wooooo', 'w']
9.元字元:+
匹配規則:匹配前面的字元出現1次或多次
例子:re.findall('[a-z][a-z]+',"hello world")
#['hello', 'world']
10.元字元:?
匹配規則:匹配前面的字元出現0次或1次
例子:匹配手機號 re.findall('-?[0-9]+',"jame,age:18, -26")
#['18', '-26']
11.元字元:
匹配規則:匹配前面的字元出現n次
例子:re.findall('1[0-9]',"jame:13886495728")
#['13886495728']
12.元字元:
匹配規則: 匹配前面的字元出現m-n次
例子:匹配qq號 re.findall('[1-9][0-9]',"baron:1259296994")
#['1259296994']
13.元字元:\d \d
匹配規則:\d 匹配任意數字字元,\d 匹配任意非數字字元
例子:匹配埠 re.findall('\d',"mysql: 3306, http:80")
#['3306', '80']
14.元字元:\w \w
匹配規則:\w 匹配普通字元,\w 匹配非普通字元
說明: 普通字元指數字,字母,下劃線,漢字。
例子: re.findall('\w+',"server_port = 8888")
#['server_port', '8888']
15.元字元:\s \s
匹配規則:\s 匹配空字元,\s 匹配非空字元
說明:空字元指 空格 \r \n \t \v \f 字元
例子: re.findall('\w+\s+\w+',"hello world")
#['hello world']
16.元字元:\s \s
匹配規則:\s 匹配空字元,\s 匹配非空字元
說明:空字元指 空格 \r \n \t \v \f 字元
例子: re.findall('\w+\s+\w+',"hello world")
#['hello world']
17.元字元:\b \b
匹配規則:\b 表示單詞邊界,\b 表示非單詞邊界
說明:單詞邊界指數字字母(漢字)下劃線與其他字元的交界位置。
例子:re.findall(r'\bis\b',"this is a test.")
#['is']
三、普通字符集的替換
正則擴充表示式
匹配\d
[0-9]
數字字元
\d[^0-9]
非數字字元
\w[a-za-z0-9]
數字字母下劃線
\w[^\w]
相反\s
[_\r\t\n\f]
**,換行等空白區域
\s[^\s]
非空白區域
四、計數符
正則匹配
零或多一或多
零或一出現n次
n到m次
至少n次
五、正規表示式的轉義
1. 如果使用正規表示式匹配特殊字元則需要加 \ 表示轉義。
特殊字元: . * + ? ^ $ () {} | \
匹配特殊字元 . 時使用 \. 表示本身含義
例子1:re.findall('-?\d+\.?\d*',"123,-123,1.23,-1.23")
#['123', '-123', '1.23', '-1.23']
例子2:s="2023年5月2日出生於中國,中國內地影視女演員-12,12.34,1/0,40%,-1.6"
r=re.findall('-?\d+\.?/?\d*%?',s)
#['1992', '5', '2', '-12', '12.34', '1/0', '40%', '-1.6']
2. 在程式語言中,常使用原生字串書寫正規表示式避免多重轉義的麻煩。
python字串 --> 正則 --> 目標字串
"\\$\\d+" 解析為 \$\d+ 匹配 "$100"
"\\$\\d+" 等同於 r"\$\d+"
六、貪婪模式和非貪婪模式
貪婪模式: 預設情況下,匹配重複的元字元總是盡可能多的向後匹配內容。比如: * + ?
非貪婪模式(懶惰模式): 讓匹配重複的元字元盡可能少的向後匹配內容。
貪婪模式轉換為非貪婪模式
在匹配重複元字元後加 '?' 號即可
* : *? #1
+ : +? #1
? : ?? #0
: ? #n
例子: re.findall(r'\(.+?\)',"(abcd)efgh(higk)")
# ['(abcd)', '(higk)']
七、正規表示式分組
1.定義:
在正規表示式中,以()建立正規表示式的內部分組,子組是正規表示式的一部分,可以作為內部整體操作物件。
2.作用:
(1)可以別作為整體操作,改變元字元的操作物件。
#(1)改變 +號 重複的物件
re.search(r'(ab)+',"ababababab").group()#'ababababab'#(2)改變 |號 操作物件
re.search(r'(王|李)\w',"王者榮耀").group()#'王者榮耀'
(2)可以通過程式語言某些藉口獲取陪陪內容中子組對應的內容部分
#獲取url協議型別
3.捕獲組:
可以給正規表示式的子組起乙個名字,表達該子組的意義。這種有名稱的子組即為捕獲組
格式:"(?ppattern)"
#給子組命名為 "pig"
re.search(r'(?pab)+',"ababababab").group('pig')#'ab'
4.注意事項:
乙個正規表示式中可以包含多個子組
子組可以巢狀,但是不要重疊或者巢狀結構複雜
子組序列號一般從外到內,從左到右計數
八、正規表示式原則
1.正確性,能夠正確的匹配出目標字串。
2.排他性,除了目標字串意外盡可能少的匹配其他內容。
3.全面性,盡可能考慮到目標字串的所有情況,不遺漏。
正規表示式(1) 元字元
數字 1 表示第n個元組中的內容 xu hao 1 re.search r a bca 1 abcabca print xu hao 1 abcabca bca 1 bcabca xu hao 2 re.search r a bca 2 abcabca print xu hao 2 abcabca ...
正規表示式 元字元
現在你已經知道幾個很有用的元字元了,如 b 還有 d 當然還有更多的元字元可用,比如 s 匹配任意的空白符,包括空格,製表符 tab 換行符,中文全形空格等 w匹配字母或數字或下劃線或漢字等。ba w b 匹配以字母a 開頭的單詞 先是某個單詞開始處 b 然後是字母a 然後是任意數量的字母或數字 w...
正規表示式 元字元
元字元 描述.點 匹配任何單個字元。例如正規表示式r.t匹配這些字串 rat rut r t,但是不匹配root。匹配行結束符。例如正規表示式weasel 能夠匹配字串 he s a weasel 的末尾 但是不能匹配字串 they are a bunch of weasels.匹配一行的開始。例如...