正則表示式是處理字串的強大工具,它有自己特定的語法結構, 有了它, 實現字串的檢索、替換、匹配驗證都不在話下。
當然, 對於爬蟲來說, 有了它, 從HTML裡面提取想要的資訊就非常方便了 。
1、基本字元介紹2、數量詞舉例:
(1) a | b 如abc|def,匹配abc或者def(2) (...) 作為分組, 表示式為(\d{4})-(\d{2})-(\d{2}),則用於匹配2017-06-03,然後用分組編號1、2、3分別獲取年、月、日三個值(3) (?P<name>...) 和 (?P=name) 如表示式為(?P<Year>\d{4})(?P=Year) 則兩個括號裡面匹配的內容完全相同,為\d{4}(4) \number (?P<Year>\d{4})\1 \1表示此處和第一個分組匹配的內容完全相同,為\d{4}(5) (?:...) (?:\d+) | "abc" 表示匹配\d+ 或者"abc" ,但第一個括號不計入分組
3、邏輯分組舉例:
(1) a | b 如abc|def,匹配abc或者def(2) (...) 作為分組, 表示式為(\d{4})-(\d{2})-(\d{2}),則用於匹配2017-06-03,然後用分組編號1、2、3分別獲取年、月、日三個值(3) (?P<name>...) 和 (?P=name) 如表示式為(?P<Year>\d{4})(?P=Year) 則兩個括號裡面匹配的內容完全相同,為\d{4}(4) \number (?P<Year>\d{4})\1 \1表示此處和第一個分組匹配的內容完全相同,為\d{4}(5) (?:...) (?:\d+) | "abc" 表示匹配\d+ 或者"abc" ,但第一個括號不計入分組
4、其他細節
(1) 貪婪與非貪婪
不加?表示貪婪匹配,如"aaa111bbbccc111" ,表示式".+\d+" 會匹配整個字串;
加?,即".+?\d+"會匹配到"aaa111"
(2) 修飾符
會在下方所講的函式中使用,
注意:
我們編寫的程式碼都是Unicode字符集,所以\w就會匹配中文漢字,然而我們上面講的\w匹配字母、數字及下劃線。有的人會認為矛盾,其實不矛盾的,中文在Unicode內部表示都是字母或漢字。所以如果我們只想匹配英文字母、不匹配漢字,就需要加上re.A.
5、re模組常用函式(1) re.match(pattern,string,flags=0)
根據pattern從string的頭部開始匹配字串,只返回第1次匹配成功的物件,否則,返回None。flags就是上面講的修飾符
r = re.match(r'Python', "Python:Java:C")
r是一個re.Match物件,若要拿到內容需要:
r.group()或r.group(0)
(2) re.search(pattern,string,flags=0)
與match()方法用法相同,唯一的區別是他可以從字元的任意位置開始匹配,一旦符合就返回
re.match(r"Python", "Java:C:Python"). 會返回None,因為該字串一開始是“Java”
re.search(r"Python", "Java:C:Python"). 匹配成功
(3) re.findall(pattern,string,flags=0)
根據pattern在string中匹配字串。如果匹配成功,返回包含匹配結果的列表,否則,返回空列表。但是pattern中有分組時,返回包含多個元組的列表,每個元組對應一個分組。
s='Python:Java:C'
re.findall("\w+", s). # 返回 ['Python', 'Java', 'C']
(4) re.split(pattern,string,maxsplit=0)
類似字串的split()函式,區別是可以根據正則表示式來切分。根據pattern分隔string,maxsplit表示最大分隔數。
s='Python:Java:C'
re.split(r"\w+", s). # 返回 ['Python', 'Java', 'C']
(5) re.sub(pattern,repl,string,count=0)
類似字串的replace函式。
根據指定的正則表示式,替換字串中的子串。pattern是一個正則表示式,repl是用於替換的字串,string是源字串,如果count為0,則返回string中匹配的所有結果。如果count>0,則返回前count個匹配結果。
s='Python:Java:C'
re.sub(r'\w+', 'php', s) # 返回 “php:php:php”
(6) re.compile(pattern,flags=0)
編譯正則表示式pattern,返回一個pattern物件。
之後我們可以用pattern物件呼叫上方所講的5種方法。
p = re.compile(r"\w+")
p.findall('Python:Java:C'). # 返回 ['Python', 'Java', 'C']