Python3正則表達式和re模塊

1. 正則表達式

1.1 正則表達式符號

2. re模塊

2.1 re.compile(pattern[, flags])

2.2 re.findall(pattern, string, flags=0)

2.3 re.finditer(pattern, string, flags=0)

2.4 re.match(pattern, string, flags=0)

2.5 re.serach(pattern, string, flags=0)

2.6 re.split(pattern, string[, maxsplit=0, flags=0])

2.7 re.sub(pattern, repl, string, count=0, flags=0)


1. 正則表達式

  • 就其本質而言,正則表達式(或RE)是一種小型的、高度專業化的編程語言,它內嵌再Python中,並通過re模塊實現。正則表達式模式被編譯成一系列的字節碼,然後由C編寫的匹配引擎執行。
  • 正則表達式用來匹配字符串,用來進行模糊匹配。
  • 字符串提供的方法是完全匹配。
  • * +?都爲貪婪匹配,也就是儘可能匹配,後面加?號使其編程惰性匹配

1.1 正則表達式符號

[ ]可以取消元字符的特殊功能,元字符僅僅爲其本身(\ ^  -例外)

正則表達式符號

描述

'.'

通配符,默認匹配除'\n'之外的任意一個字符

'^'

匹配字符開頭

'$'

匹配字符結尾

'*'

貪婪匹配。匹配前面的子表達式0或多次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。等價於{0, +∞}

'+'

匹配前面的子表達式1或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”等價於{1, +∞}

'?'

匹配前面的子表達式0或1次。等價於{0, 1}

'.*'

匹配除'\n'之外的任意一個字符0或多次

'{m}'

匹配前一個字符m次

'{n, m}'

貪婪匹配。匹配前一個字符至少n次

'{n, m}'

貪婪匹配。匹配前一個字符n到m次

'[abc]'

匹配所包含的任意一個字符

'[a-z]'

匹配指定範圍內的任意字符

'[^a-z]'

匹配任何不在指定範圍內的任意字符

'|'

匹配|左或|右的字符

a|b

匹配a或b

'\'

反斜槓後邊跟元字符去除特殊功能,反斜槓後邊跟部分普通字符實現特殊功能

'(re)'

分組匹配,匹配括號內的表達式

'\A'

匹配字符串開始

'\b'

匹配一個單詞的邊界,也就是指單詞和空格間的位置,需加r(原始字符串)

'\B'

匹配非單詞邊界。

'\d'

匹配任何十進制數。等價於[0-9]

'\D'

匹配任何非數字字符。等價於[^0-9]

'\G'

匹配最後匹配完成的位置

'\n'

匹配一個換行符

'\s'

匹配任何不可見字符。等價於[ \f\n\r\t\v]。

'\S'

匹配任何可見字符。等價於[^ \f\n\r\t\v]。

'\t'

匹配一個製表符

'\w'

匹配不包括下劃線的任何字母數字字符或中文。類似但不等價於“[A-Za-z0-9_]

'\W'

匹配任何非單詞字符。等價於[^A-Za-z0-9_]

'\z'

匹配字符串結束

'\Z'

匹配字符串結束。如果存在換行,只匹配到換行前的結束字符串

2. re模塊

方法

描述

re.compile(pattern[, flags])

用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() search() 這兩個函數使用。

re.findall(pattern, string, flags=0)

在字符串中找到正則表達式所匹配的所有子串,並返回一個列表。如果沒有找到匹配的,則返回空列表

re.finditer(pattern, string, flags=0)

 

在字符串中找到正則表達式所匹配的所有子串,並把它們作爲一個迭代器返回

re.match(pattern, string, flags=0)

返回只在字符串開始匹配的對象。可以使用group() 或 groups() 匹配對象函數來獲取匹配表達式

re.serach(pattern, string, flags=0)

返回匹配到的第一個對象。可以使用group() 或 groups() 匹配對象函數來獲取匹配表達式

re.split(pattern, string[, maxsplit=0, flags=0])

按照能夠匹配的子串將字符串分割後返回列表

re.sub(pattern, repl, string, count=0, flags=0)

替換字符串中的匹配項

flags參數

說明

re.l

使匹配對大小寫不敏感

re.L

做本地化識別匹配(locale-aware)

re.M

多行匹配,影響^和$

re.S

使.匹配包括換行在內的所有字符

re.U

根據Unicode字符集解析字符。這個標誌影響\w,\W,\b,\B

re.X

該標誌通過給予更靈活的格式以便你將正則表達式寫得更容易理解

2.1 re.compile(pattern[, flags])

用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() search() 這兩個函數使用。

>>> import re
>>> a = re.compile('\.com')
>>> a.findall('www.baidu.com')
['.com']

2.2 re.findall(pattern, string, flags=0)

在字符串中找到正則表達式所匹配的所有子串,並返回一個列表。如果沒有找到匹配的,則返回空列表

>>> import re
>>> re.findall('.*', 'hello')
['hello', '']
>>> re.findall('www.(\w+).com', 'www.baidu.com')
['baidu']
>>> re.findall('www.(?:\w+).com', 'www.baidu.com')
['www.baidu.com']
>>> re.findall('\\\\', 'abc\de')
['\\']
>>> re.findall(r'\\', 'abc\de')
['\\']

>>> re.findall('<a>(.*?)</a>',li)
['這個是內容', '這個是內容']
>>> li = '<div><ul><li><a>這個是內容</a></閃電></ul><ul><li><a>這個是內容</a></閃電></ul></div>'
>>> re.findall('<a>(.*)</a>',li)                  #貪婪匹配
['這個是內容</a></閃電></ul><ul><li><a>這個是內容']
>>> re.findall('<a>(.*?)</a>',li)                 #惰性匹配
['這個是內容', '這個是內容']

 

 

 

 

2.3 re.finditer(pattern, string, flags=0)

在字符串中找到正則表達式所匹配的所有子串,並把它們作爲一個迭代器返回

>>> import re
>>> a = re.finditer('\d', 'adf12345afds')
>>> print(next(a).group())
1
>>> print(next(a).group())
2
>>> print(next(a).group())
3
>>> print(next(a).group())
4
>>> print(next(a).group())
5


2.4 re.match(pattern, string, flags=0)

 

返回只在字符串開始匹配的對象。可以使用group() 或 groups() 匹配對象函數來獲取匹配表達式

>>> import re
>>> html = "<a>這是一個超鏈接!</a>"
>>> re.match('<(\w+)>.*</(\w+)>',html)
<re.Match object; span=(0, 15), match='<a>這是一個超鏈接!</a>'>
>>> re.findall('<a>(.*)</a>',html)
['這是一個超鏈接!']

>>> ret = re.match('<a>(.*)</a>', html)           #分組匹配
>>> ret.group()
'<a>這是一個超鏈接!</a>'
>>> ret.group(1)
'這是一個超鏈接!'

2.5 re.serach(pattern, string, flags=0)

返回匹配到的第一個對象。可以使用group() 或 groups() 匹配對象函數來獲取匹配表達式

>>> import re
>>> ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})', 'weeew34ttt123/ooo')
>>> ret.group()
'123/ooo'
>>> ret.group('id')
'123'
>>> ret.group('name')
'ooo'

2.6 re.split(pattern, string[, maxsplit=0, flags=0])

按照能夠匹配的子串將字符串分割後返回列表

>>> import re
>>> re.split('[b]', 'abcdabcdabcd')
['a', 'cda', 'cda', 'cd']
>>> re.split('[bd]', 'abcdabcdabcd')
['a', 'c', 'a', 'c', 'a', 'c', '']
>>> re.split('[ab]', 'abcdabcdabcd')
['', '', 'cd', '', 'cd', '', 'cd']


2.7 re.sub(pattern, repl, string, count=0, flags=0)

替換字符串中的匹配項

>>> import re
>>> re.sub('p.*n', 'world', 'hello,python')
'hello,world'
>>> re.sub('\d', 'abc', 'p1p2p3')
'pabcpabcpabc'

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章