我們寫一個爬蟲, 主要還是要提取網頁中的文本信息, 而正則表達式可以很容易的完成這一任務, 這節, 我們來學習一些基本的正則表達式用法, 在以后的章節中, 會在適當的時候插入一些高級用法。
在python中, 使用正則表達式需要引入re包
1. 匹配普通字符.
任何數字, 字母, 標點符號等, 都可以直接匹配到
1 import re 2 3 # 匹配數字構成的字串123 4 string = '012345' 5 p = re.search('123', string) 6 print(p.group(0)) 7 8 # 匹配字母構成的字串abc 9 string = '012abc345' 10 p = re.search('abc', string) 11 print(p.group(0)) 12 13 # 匹配標點符號構成的字串,"} 14 string = '01234,"}5' 15 p = re.search(',"}', string) 16 print(p.group(0))
2. 特殊字符.
正則表達式中定義了一些有着特殊含義的字符, 這些字符只有使用 \ 轉義以后才能按照字面意思理解
| 字符 | 含義 | 舉例說明 |
| ^ | 匹配字符串的開頭 | 比如 ^abc 可以匹配 abcd, 但是卻不能匹配 0abc |
| $ | 匹配字符串的結尾 | 比如 abc$ 可以匹配123abc, 卻不能匹配 123abcd |
| * | 前一字符匹配零次或者多次 | 比如 ba* 可以匹配 b 或者 ba, 或者baaaaaaa |
| + | 前一字符匹配一次或者多次 | 比如 ba+ 可以匹配 ba 或者 baaaa ,但是不能匹配 b |
| ? | 前一字符匹配零次或者一次 | 比如 ba? 可以匹配 b 或者 ba 但不能匹配 baa |
| () | 表示一個子表達式, 稱為元組, 使用元組可以提取出子串 | 比如 abc(123)def , 當用來我們匹配字符串000abc123defgh時, 我們可以匹配到兩個字符串, 分別是 abc123def 和 123 |
| [] | 放在[]之間的字符是或的關系,表示匹配到其中一個即可, 需要注意的是^在其中表示匹配非其中的字符的字符, 比如[^345]表示匹配不是3且不是4且不是5的字符 | [abc]可以匹配字符a 也可以匹配字符 b, 還可以匹配字符 c [^abc]可以匹配除a, b, c以外的所有字符 [0-9]可以匹配數字0,1,2,3,4,5,6,7,8,9 [a-z]可以匹配26個小寫字母 [A-Z]可以匹配26個大寫字母 |
| | | 表示或的關系 | ab|12可以匹配到 字符串 ef12cdab34中的ab 和 12 |
| {} | 可以用於指定前一字符的匹配次數 | a{3}可以匹配 字符串abaaacd中的aaa, 但不能匹配aa, a{1,3} 可以匹配 a, aa, aaa, a{2,}表示至少匹配兩個a, a{1, }表示至少匹配1個a, 等價於a+ a{0,}表示至少匹配0次a, 等價於a* |
| . | 可以匹配除換行符\n之外的所有字符 | 比如 a.d可以匹配 a_d, abd, a0d等 |
這里對*, + , ?需要特別說明:
*和+默認采用貪婪模式, 即會盡可能多的匹配, 比如a* 會優先匹配abcaaadef中的 aaa, 而如果配合?使用, 就可以采用非貪婪模式, 比如a*? 會優先匹配abcaaadef 中的a
3.轉義符
| 字符 | 含義 | 舉例說明 |
| \d | 匹配任意數字 | 例如\d{3}可以匹配123, 456, 011等由任意三個數字構成的字符串 |
| \D | 匹配任意非數字字符 | 例如\D{2}可以匹配a_, ab, _#, aa等由任意兩個非數字字符構成的字符串, 但不能匹配諸如a0, 00, _0的字符串 |
未完待續。。。
