re模組
python爬蟲過程中,實現頁面元素解析的方法很多,正則解析只是其中之一,常見的還有BeautifulSoup和lxml,它們都支援網頁HTML元素解析,re模組提供了強大的正規表示式功能
re模組常用方法
-
compile(pattern,flags=0)
:用於編譯一個正規表示式字串,生成一個re.pattern
物件- 引數:
pattern
:正規表示式字串,flags
:可選標誌,用於修改匹配行為(下面會詳細講解)
pattern = re.compile(r'a.*e')
- 引數:
-
search(pattern,string,flag=0)
:搜尋字串中第一個匹配,返回一個匹配物件,否則返回None
- 引數:
pattern
:正規表示式字串或編譯後的re.pattern
物件,string
:要搜尋的字串,flags
:用於修改匹配行為(如re.IGNORECASE、re.MULTILINE
等) - 返回值:返回一個
re.Match
物件或None
result = re.search(r'\bcat\b', 'The cat sat on the mat') #輸出<re.Match object; span=(4, 7), match='cat'> 接下來會解釋
- 引數:
-
match(pattern,string,flags=0)
:從字串的開頭匹配,如果匹配成功返回一個匹配物件,否則返回None
- 引數
pattern
:正規表示式字串或編譯後的re.Pattern
物件,string:
要匹配的字串,flags
:可選的標誌,用於修改匹配行為 - 返回值:返回一個
re.Match
物件或None
result = re.search(r'\bcat\b', 'The cat sat on the mat')
- 引數
-
findall(pattern,string,flags=0)
:返回所有匹配的子串列表- 返回值:一個包含所有匹配子串的列表
result = re.findall(r'\bcat\b', 'The cat sat on the cat mat') #輸出['cat', 'cat']
-
finditer(pattern,string,flags=0)
:返回一個迭代器,產生所有匹配的Match
物件- 返回值:一個迭代器,產生 re.Match 物件
result = re.finditer(r'\bcat\b', 'The cat sat on the cat mat') for match in result: print(match) #<re.Match object; span=(4, 7), match='cat'> #<re.Match object; span=(19, 22), match='cat'>
-
sub(pattern,repl,string,count=0,flags=0)
:替換字串中所有匹配的子串- 引數:
repl
:替換字串或替換函式,count
:可選引數,指定最大替換次數,預設為0(替換所有匹配) - 返回值:替換後的字串
result = re.sub(r'\bcat\b', 'dog', 'The cat sat on the cat mat') print(result) #The dog sat on the dog mat
- 引數:
-
split(pattern,string,maxsplit=0,flags=0)
:根據匹配的字串分割字串- 引數:
maxsplit
:可選引數,指定最大分割次數,預設為0(不限分割次數) - 返回值:一個包含分割結果的列表
text = "The cat sat on the cat mat" result = re.split(r'\b', text) print(result) #['', 'The', ' ', 'cat', ' ', 'sat', ' ', 'on', ' ', 'the', ' ', 'cat', ' ', 'mat', '']
- 引數:
flags模式標誌位
模式匹配支援多種模式標誌,用於修改匹配模式行為
re.IGNORECASE或re.I
-
忽略大小寫匹配模式
-
eg:
text = "The cat sat on the cat mat" regex = re.compile("CAT", re.IGNORECASE) result = regex.search(text) if result: print(result.group()) else: print("not found") #output-> cat
re.MULTILINE或re.M
-
多行模式,使 ^ 和 $ 匹配每行的開始和結束
-
eg:
text = """first Line second Line2 third Line3""" regex = re.compile(r'^\w+', re.MULTILINE) result = regex.findall(text) print(result) #output->['first', 'second', 'third']
re.DOTALL 或 re.S
-
可以使得
.
匹配包括換行符在內的所有字元 -
eg:
text = "abc\ndef\nghi" regex = re.compile(r'.*', re.DOTALL) result = regex.findall(text) print(result) #output->['abc\ndef\nghi', '']
re.VERBOSE 或 re.X
-
允許在正規表示式中使用註釋和空白
-
eg:
text = "The cat sat on the mat" regex = re.compile(r""" \b #單詞邊界 cat#匹配"cat" \b#單詞邊界 """, re.VERBOSE) result = regex.findall(text) print(result) #output->['cat']
內嵌模式標誌
內嵌模式的功能與flags標誌位的功能一致,與之不同的是使用內嵌模式標誌和註釋可以增強正規表示式的可讀性和靈活性
常用的內嵌模式標誌
-
(?i)
:忽略大小寫eg:
text = "hello world" regex = re.compile(r"(?#忽略大小寫)(?i)HELLO WORLD") # (?#...) 是一個註釋語法 result = regex.match(text).group() print(result)
-
(?m)
:多行模式,使 ^ 和 $ 匹配每行的開始和結束,而不僅僅是整個字串的開始和結束eg:
text = """first Line second Line third Line""" regex = re.compile(r"(?#多行模式)(?m)^\w+") result = regex.findall(text) print(result) #output->['first', 'second', 'third']
-
(?s)
:點匹配所有字元模式eg:
text = "abc\ndef\nghi" regex = re.compile(r"(?#.號匹配換行符在內的所有字元)(?s).*") result = regex.findall(text) print(result) #output->['abc\ndef\nghi', '']
-
(?x)
:允許註釋和空白eg:
text = "The cat sat on the mat" regex = re.compile(r"(?#允許註釋)(?ix)\bCAT\b") # ix->忽略大小寫的註釋模式 result = regex.findall(text) print(result) #output->['cat']
re.Match 物件
re.Match物件是re模組中的一個類,用於表示正規表示式匹配的結果,當使用
re.search,re,match
或re.finditer
方法時,若找到了匹配項,這些方法就會返回一個re.Match
物件
re.Match返回欄位解釋
當使用print列印re.Match物件通常會返回
<re.Match object; span=(4, 7), match='cat'>
這種類似的欄位
<re.Match object;
:該部分表示的這是一個re.Match物件span=(4, 7)
:表示一個元組,表示的是匹配字串在原始字串中起始索引和結束索引match='cat’
:match是一個字串,表示實際匹配的字串
訪問 re.Match 物件的屬性
透過訪問re.Match物件的屬性,我們可以獲取更多資訊
group()
:返回匹配的子字串,如match.group()
返回’cat’
start(
):返回匹配字串在原始字串的起始索引end()
:返回匹配字串在原始字串的結束索引span()
:返回元組表示字串的起始與結束索引