在python中通過內置的re庫來使用正則表達式,它提供了所有正則表達式的功能。
一.寫在前面:關於轉義的問題
正則表達式中用“\”表示轉義,而python中也用“\”表示轉義,當遇到特殊字符需要轉義時,你要花費心思到底需要幾個“\”,所以為了避免這個情況,牆裂推薦使用原生字符串類型(raw string)來書寫正則表達式。
方法很簡單,只需要在表達式前面加個“r”即可,如下
r'\d{2}-\d{8}'
r'\bt\w*\b'
二.Re庫常用的功能函數
1. re.match()
從字符串的起始位置匹配,匹配成功,返回一個匹配的對象,否則返回None
語法:re.match(pattern, string, flags=0)
pattern:匹配的正則表達式
string:要匹配的字符串
flags:標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等;flags=0表示不進行特殊指定
可選標志如下:
修飾符被指定為一個可選的標志。多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志
示例:
不含標志位: >>> re.match(r'\d{2}','123') <_sre.SRE_Match object; span=(0, 2), match='12'>
>>> re.match(r'\d{2}','ab123') >>> print(re.match(r'\d{2}','ab123')) None 含有標志位: >>> re.match(r'a','ab123').group() 'a'
>>> re.match(r'a','Ab123').group() Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> re.match(r'a','Ab123').group() AttributeError: 'NoneType' object has no attribute 'group'
>>> re.match(r'a','Ab123',re.I).group() 'A'
2. re.search()
掃描整個字符串並返回第一個成功的匹配對象,否則返回None
語法:re.search(pattern, string, flags=0)
示例:
>>> re.search(r'\d{2}','Ab123') <_sre.SRE_Match object; span=(2, 4), match='12'>
>>> re.search(r'\d{2}','Abcde') >>> print(re.search(r'\d{2}','Abcde')) None
可以看到match()和search()返回的時match對象(即匹配對象),可以通過group()方法獲得匹配內容
>>> re.search(r'\d{2}','Ab12c34d56e78').group() '12' >>> re.match(r'\d{2}','12c34d56e78').group(0) '12'
group() 同group(0)就是匹配正則表達式整體結果,也就是所有匹配到的字符
group()其實更多的結合分組來使用,即如果在正則表達式中定義了分組(什么是分組?參見正則表達式學習,一個左括號“(”,表示一個分組),就可以在match
對象上用group()
方法提取出子串來。后面會單獨寫一下group()和groups()的用法,這里先簡單了解一下。
re.match與re.search的區別:
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配(注意:僅僅是第一個)
3. re.findall()
在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表
注意: match 和 search 是匹配一次,而findall 匹配所有
>>> re.findall(r'\d{2}','21c34d56e78') ['21', '34', '56', '78']
4. re.finditer()
和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回.
示例:
>>> match = re.finditer(r'\d{2}','21c34d56e78') >>> for t in match: print(t.group()) 21
34
56
78
>>>
5. re.split()
根據正則表達式中的分隔符把字符分割為一個列表並返回成功匹配的列表.
示例:
>>> match = re.split(r'\.|-','hello-world.data') # 使用 . 或 - 作為字符串的分隔符 >>> print(match) ['hello', 'world', 'data']
字符串也有split方法,如下,作個對比:
字符串的split方法 >>> 'a b c'.split(' ') # b和c之間有3個空格
['a', 'b', '', '', 'c']
如果用空格不好理解的話,可以換位x >>> 'axbxxxc'.split('x') ['a', 'b', '', '', 'c'] >>>
可以看到,單純用字符串的split方法無法識別連續的空格,
用正則表示式如下:
>>> re.split(r'\s+', 'a b c') # \s+ 表示匹配一個或多個空白符(\s表示匹配空白符,+表示重復1次或1次以上) ['a', 'b', 'c'] >>>
6. re.sub()
用於替換字符串中的匹配項
語法: re.sub(pattern, repl, string, count=0)
- pattern : 正則中的模式字符串。
- repl : 替換的字符串,也可為一個函數。
- string : 要被查找替換的原始字符串。
- count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
示例:
>>> match = re.sub(r'a', 'b','aaccaa') # 把字符串中的a都替換為b >>> print(match) bbccbb >>>
參考:https://www.cnblogs.com/yan-lei/p/7653362.html和菜鳥教程