標籤:替換 back 分組 order .com 參數 顯示 查詢 arch
1.Regex
正則,只跟字串相關,就是匹配字串內容的一種規則。
正則主要有兩部分組成,要尋找字元的類型,以及要尋找字元的數量。(自己的理解)
字元的類型:(相當於你要找的部分內容)
元字元 |
匹配內容 |
| . |
匹配除分行符號以外的任一字元 |
| \w |
匹配字母或數字或底線 |
| \s |
匹配任意的空白符 |
| \d |
匹配數字 |
| \n |
匹配一個分行符號 |
| \t |
匹配一個定位字元 |
| \b |
匹配一個單詞的結尾 |
| ^ |
匹配字串的開始 |
| $ |
匹配字串的結尾 |
| \W |
匹配非字母或數字或底線 |
| \D |
匹配非數字 |
| \S |
匹配非空白符 |
| a|b |
匹配字元a或字元b |
| () |
匹配括弧內的運算式,也表示一個組 |
| [...] |
匹配字元組中的字元 |
| [^...] |
匹配除了字元組中字元的所有字元 |
代表數量的量詞:(相當於你要找的部分內容對應的個數)
量詞 |
用法說明 |
| * |
重複零次或更多次 |
| + |
重複一次或更多次 |
| ? |
重複零次或一次 |
| {n} |
重複n次 |
| {n,} |
重複n次或更多次 |
| {n,m} |
重複n到m次 |
樣本:
‘d\d+\w{3,6}p‘ 這個Regex代表的是:以d開頭,後邊是數字,數量是1個或者多個,後邊是字母、數字、底線,數量是3-6個,然後以一個p結尾。
備忘:這裡都是預設為貪婪模式,數量能找到滿足條件的多個,就找多個,非貪婪模式的是在表達數位後邊加‘?’號。如右:‘d\d+?\w{3,6}?p‘
代表要尋找字元位置的符號:
^ 和 $ : ^代表在字串的開頭出現,$ 代表在字串的末尾出現。
樣本
string = ‘海燕海東海西‘
^海. 會匹配到 開頭的‘海燕’ ,全部的意思是:匹配開頭是海這一個字,後邊跟一個除分行符號之外的一個字元。
海.$ 會匹配到結尾的‘海西’ ,全部的意思是 :匹配結尾的海+一個除分行符號之外的一個字元。
字元集[][^]
[ ] 表示這一個位置可能出現的字元,注意是一個位置,表示多個位置的話,可以是 [ ]*,或者 [ ]+ 等[ ]後邊跟量詞
[ ^ ] 表示取非,即這一個位置可能出現的字元除了括弧內的,
分組 ()與 或 |
樣本:
() 表示把一些字元看成一個整體, | 是或的意思。
([1-9]\d{16}[0-9x]|[1-9]\d{14}) 表示先匹配[1-9]\d{16}[0-9x]如果沒有匹配上就匹配[1-9]\d{14}
2.Python 下的Regex—— re 模組
re模組常用方法:findall、search、 match、 split、 sub、
re.findall(pattern,)
尋找滿足條件的字串,返回一個列表,元素是每一個找到的子字串,
1 樣本:2 str = ‘fhsjdhal66478636666guy66666hhfieyhf‘3 ret5 = re.findall(‘\d{4,6}?‘,str)4 print(ret5)
結果:
[[‘6647‘, ‘8636‘, ‘6666‘]] # 此處是非貪婪模式
findall中有個分組優先的原則:
# 如果沒有分組,是這樣子的:str = ‘11512319890965443xhfauh630289768776545678ucufy‘ret5 = re.findall(‘[0-9]\d{5}\d{8}\d{3}[0-9x]‘,str) # ret5 = re.findall(r‘[1-9]\d{16}[0-9x]‘,str)print(ret5)結果是:>>> [‘11512319890965443x‘, ‘630289768776545678‘]假如我分組了,就會返回組裡邊的資訊,str = ‘62012319890965443xhfauh630289768776545678ucufy‘ret5 = re.findall(‘[0-9]\d{5}(\d{8})\d{3}[0-9x]‘,str)# ret5 = re.findall(r‘[1-9]\d{16}[0-9x]‘,str)print(ret5)結果是:>>> [‘19890965‘, ‘76877654‘]其實其他位置的也匹配到了,只是沒有顯示出來而已。
re.resarch()
在字串內尋找模式比對,只到找到第一個匹配然後返回一個包含匹配資訊的對象,通過.group()方法調用。
1 ret = re.search(‘a‘, ‘eva egon yuan‘).group()2 print(ret) 3 #結果 : ‘a‘
re.math()
在字串開始處進行匹配,如果不在開頭,則會報錯,如找到,返回的跟search一樣。
1 ret = re.match(‘a‘, ‘abc‘).group() 2 print(ret)3 4 #結果 : ‘a‘
re.finditer()
返回一個存放匹配結果的迭代器
1 import re2 ret = re.finditer(‘\d‘, ‘ds3sy4784a‘) #finditer返回一個存放匹配結果的迭代器3 print(ret) # <callable_iterator object at 0x10195f940>4 print(next(ret).group()) #查看第一個結果5 print(next(ret).group()) #查看第二個結果6 print([i.group() for i in ret]) #查看剩餘的左右結果
re.split 返回一個切割之後的列表。
ret = re.split(‘[ab]‘, ‘abcd‘)
# 先按‘a‘分割得到‘‘和‘bcd‘,在對‘‘和‘bcd‘分別按‘b‘分割 print(ret) # [‘‘, ‘‘, ‘cd‘] 注意這裡
split的優先順序查詢
ret=re.split("\d+","eva3egon4yuan")print(ret) #結果 : [‘eva‘, ‘egon‘, ‘yuan‘]ret=re.split("(\d+)","eva3egon4yuan")print(ret) #結果 : [‘eva‘, ‘3‘, ‘egon‘, ‘4‘, ‘yuan‘]#在匹配部分加上()之後所切出的結果是不同的,#沒有()的沒有保留所匹配的項,但是有()的卻能夠保留了匹配的項,#這個在某些需要保留匹配部分的使用過程是非常重要的。
re模組其他的方法:
sub 替換 、compile()編譯成一個對象
ret = re.sub(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘, 1)#將數字替換成‘H‘,參數1表示只替換1個print(ret) #evaHegon4yuan4ret = re.subn(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘)#將數字替換成‘H‘,返回元組(替換的結果,替換了多少次)print(ret)obj = re.compile(‘\d{3}‘) #將Regex編譯成為一個 Regex對象,規則要匹配的是3個數字ret = obj.search(‘abc123eeee‘) #Regex對象調用search,參數為待匹配的字串print(ret.group()) #結果 : 123
python與Regex