Python學習 :正則表示式
阿新 • • 發佈:2018-11-01
正則表示式
python 使用正則表示式(re)來進行匹配引擎搜尋
正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”
關於正則表示式,必須先學會它的元字元
元字元 : ^ $ * + ? { } [ ] | ( ) \
. 匹配除\n(換行符)以外的任何字元,若指定flag DOTALL,則匹配任意字元,包括換行
s = re.findall('b...u', 'www.baidu.com www') >>> ['baidu']
^ 匹配字元開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
s = re.findall('^w.w', 'www.baidu.com wWw') >>> ['www']
$ 匹配字元結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
s = re.findall('w.w$', 'www.baidu.com wWw') >>> ['wWw']
* 匹配*號前的字元0次或多次
s = re.findall('abc*', 'abccccccc') >>> ['abcccccc'] s = re.findall('abc*', 'ab') >>> ['ab']
+ 匹配前一個字元1次或多次
s = re.findall('abc+', 'abccccccc') >>> ['abcccccc']
? 匹配前一個字元1次或0次
s = re.findall('abc?', 'abccccccc') >>> ['abc']
{n} 匹配前一個字元n次,即前一個字元至少出現n次
s = re.findall('abc{2}', 'abccccccc') >>> ['abcc']
{n,m} 匹配前一個字元n到m次
s = re.findall('abc{2,3}', 'abccccccc') >>> ['abccc']
| 匹配|左或|右的字元
s = re.findall('abc|ABC', 'abcABC') >>> ['abc', 'ABC']
() 提取括號中的內容
s = re.findall('(bai)', 'www.baidu.com') >>> ['bai']
[ ] 字符集:1、[ab] 取a或b 2、字符集裡的符號沒有特殊的意義 3、尖角號^取反 4、選擇出某種元素
# 1、[] 裡面的元素取其一 s = re.findall('[aid]', 'www.baidu.com') >>>['a', 'i','d'] # 2、消除符號的特殊意義 s = re.findall('[*]', 'abccccccc*') >>>['*'] # 3、取反 s = re.findall('[^abc]', 'abcABC') >>>['A', 'B', 'C'] # 4、選擇元素(數字或字母) s = re.findall('[a-z]', 'ab123c41d2ABeC') >>>['a', 'b', 'c', 'd', 'e']
\ 反斜槓後邊跟元字元去除特殊功能,反斜槓後邊跟普通字元實現特殊功能
通用字元
\A 只從字元開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 \Z 匹配字元結尾,同$ \D 匹配非數字 \S 匹配任何非空白字元 \W 匹配非[A-Za-z0-9] \d 匹配數字0-9,十進位制數字 \w 匹配[A-Za-z0-9],匹配任一字母、數字、下劃線 \s 匹配空白字元、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
模式修正符,一般放在最後位置
I re.I 不區分大小寫
M re.M 多行匹配,改變'^'和'$'的行為
S re.S 點任意匹配模式,改變'.'的行為
常用的匹配語法
re.findall() # 完全匹配,把所有匹配到的字元放到以列表中的元素返回 re.findall('com','www.baidu.com map.baidu.com') >>> ['com', 'com'] re.match() # 從頭開始匹配 re.match('com','www.baidu.com map.baidu.com') >>> None re.search() # 搜尋匹配,僅返回一個結果;通過呼叫group()方法得到匹配的字串,如果字串沒有匹配,則返回None。 re.search('com','www.baidu.com map.baidu.com').group() >>> com re.split() # 按照能夠匹配的子串將字串分割後返回列表。maxsplit用於指定最大分割次數,不指定使用預設值0將全部分割 re.split('\d','www.1baidu2.3com',2) # 預設為0,即全部分隔;指定次數後只分隔兩次 >>> ['www.', 'baidu', '.3com'] re.split(' ','www.baidu.com map.baidu.com') # 分隔空格 >>> ['www.baidu.com', 'map.baidu.com'] re.sub() # 匹配字元並進行替換 re.sub('\d','ai','www.b1du.com ',1) # 替換一次 >>> www.baidu.com re.subn() # 與 sub 函式完全一致,只不過其返回值是包括兩個元素的元組:(new_string, number);第一個返回值 new_string 為sub 函式的結果,第二個 number 為匹配及替換的次數。 ret=re.subn('\d','ai','www.b1du.com map.b2du.com',2) # 替換兩次 >>> ('www.baidu.com map.baidu.com', 2)
re 模組的兩種匹配模式
貪婪模式:儘可能多的去匹配
惰性模式:儘可能少的去匹配(後面加?號來限制)