python也和其他语言一样也提供了丰富的正则匹配表达式,在爬虫中解析服务器的内容时也经常需要用到,python的正则匹配为re库,其官方文档链接为: Lib/re.py
在官方文档中特别说明正则匹配表达式为str格式,其匹配特殊字符或者特殊表达式时前面要加'\', 又已知‘\’在表达式中为特殊字符,如果要表达该字符时前面要加‘\’,所以在一个字符表达式中要表达为'\'时需要输入‘\\’, 而又只知道正则表达式前面需要加'\'.所以在要匹配一个‘\’时,其正则表达式应该为'\\\\‘其意思为正则表达式匹配一个‘\’, 前面一个'\\'为正则表达式的'\',后面一个'\\'为‘\'字符。
正则表达式是使用python的raw格式,所以在正则表达式中'\n'为两个字符一个为'\',两位一个为'n',而在字符串中'\n'为一个字符表达为换行符。
Regular Expression Syntax
在正则表达式中,如果A和B都是正则表达式,那么AB也是正则表达式。如何一个字符串p匹配A,字符串q匹配B,那边pq也会和AB表达式匹配,除非A和B有匹配优先级或者A和B之前有其他边界条件。
正则表达式也可以包含特殊或原始字符,大部分原始字符'A','a'或‘0’为简单的匹配规则,也允许将过个字符链接,比如‘last’匹配规则表示需要匹配‘last’字符串
特殊的限定符(*
, +
, ?
, {m,n}
, etc)不能直接用于嵌套,主要是为了防止和非贪婪修饰符?混淆。
在正则表达式中有些特殊的字符表述特殊的匹配规则,其列表如下
特殊字符 | 描述 |
. | 匹配任意字符除了换行符, 当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 注意只匹配一个字符 例如: print(re.match('.','qwdqwf')) 匹配结果为第一个字符q |
^ | 匹配该字符串开头,如果要匹配的字符串不是以该字符串开头,则返回none 例如: print(re.match('^d','qwdqwf')) 返回none |
$ | 匹配结束字符串的结尾,如果有换行则匹配换行前的字符串是否已要匹配的字符串结尾 例如: re.search('foo$','fool\n'), 匹配结果为none re.search('fool$',111fool\n'): 匹配结果为fool re.search('fool.$',111fool\n'):匹配结果为fool re.search('foo.$', '111fool\nfoo2\n'):匹配结果为foo2 在MULTILINE模型下即多行模式下匹配结果为前面首次的匹配结果: 例如: re.search('foo.$', '111fool\nfoo2\n', flags=re.M):匹配结果fool |
* | 匹配0个或多个表达式 例如 ab*, 匹配的表达式为a, ab或者 ab后面跟着任何字符 re.search('ab*', 'a'):匹配结果a re.search('ab*', 'a111'):匹配结果a re.search('ab*', 'ab'):匹配结果ab re.search('ab*', 'abdwf'):匹配结果ab re.search('ab*', 'b1111'):匹配结果为none re.search('ab*', 'bdda'):匹配结果为a re.search('d*', 'abfef'):匹配结果为空 |
+ | 匹配1个或者多个表达式 例如 ab+ 将匹配ab后面跟任何字符,而不会匹配a re.search('ab+', 'abfef'):匹配结果:ab re.search('ab+', 'a'):匹配结果:none re.search('ab+', 'acdf'):匹配结果:none |
? | 匹配0个或多个表达式,为非贪婪匹配 例如: ab? 匹配表达式为匹配a或者ab 使用用例: re.search('ab?', 'acdf'):匹配结果为:a re.search('ab?', 'dabkn'):匹配结果为:ab re.search('ab?', 'dcbkn'):匹配结果为:none |
*?,+?,?? | '*','+',和‘?”即为贪婪模式匹配,而加上?将会按照非贪婪模式匹配 例如: re.search('ab*?', 'abc'), 匹配结果为为a, 已知ab* 为a, b或者ab后面跟任意数字,ab*?按照非贪婪模式最小匹配为需要匹配a re.search('ab+?', 'abc'), 匹配结果为a, 已知ab+匹配为ab,或者ab后跟任意字符,而ab+?按照最小匹配为ab re.search('ab??', 'abc'), 匹配结果为a, 已知ab?匹配为a或者ab,ab??按照ab?最小匹配为a |
{m} | 将前面拷贝成m分进行匹配,连续少于m个将不能匹配 例如: a{6}匹配连续6个a re.search('a{6}', 'vbhaaa'):匹配结果为none re.search('a{6}', 'vbhaaaaaaefgeg'):匹配结果为aaaaaa re.search('a{6}', 'vbhaaaaaaaaaaaaefgeg'):匹配结果为aaaaaa
|
{m, n} | 匹配从m到n中的任意个数 例如 b{3,5}匹配3到5个任意个数的b re.search('b{3,5}', 'vabbb') 匹配结果bbb re.search('b{3,5}', 'vabbbb'),匹配结果bbbb re.search('b{3,5}', 'vabbbbb')匹配结果bbbbb re.search('b{3,}', 'vabbbbbb') 匹配结果bbbbb re.search('b{3,5}', 'vabb'):匹配结果为none 当n不填是,可以匹配到m到1000个任意数量 re.search('b{3,}', 'vabbbbbbbbbbbbbb'),匹配结果:bbbbbbbbbbbbbb re.search('b{3,}', 'vabb');匹配结果为none
|
{m,n}? | 按照最小匹配原则,即匹配m个字符 例如: b{3,5}? 匹配bbb 例如: re.search('b{3,5}?', 'vabbbbbbb'):匹配结果为bbb |
\ | 即可以作为向‘’*’‘?’’为转义字符,有可以作为一个特殊的序列 如果在正则表达式中不是raw 格式字符串,python将把'\'作为转义序列。如果python 解析器不识别转义序列,将把'\'以及后面的字符作为字符串中的内容进行输出。 如果python识别转义序列,将需要使用连续两个斜杠'\\'来表示 |
[] | 1: 用来表示一组字符,例如[amk]匹配表达式为'a','m','k 用例: re.search('[abc]', 'wefnwabeo') 匹配结果a re.search('[abc]', 'wefnweo') 匹配结果none 2:也可以使用‘-’来表示一个范围,例如[a-z] 匹配a到z的字符 re.search('[a-z]', '2488s9rg') 匹配结果 a 3: 在该表达式中特殊字符将失去原有意义,比如[(+*)],匹配表达式为‘(’ “+” ‘*’ “)” re.search('[(+*)]', '2488(s9rg'): 匹配结果: '(' re.search('[(+*)]', '24*88(s9rg'): 匹配结果: '*' 4:如果要匹配的字符不在序列范围之内,可以单独使用单引号‘’,例如 re.search("[5~6'8']", '2s4*88(s9rghe'):匹配结果为:8 5:如果要匹配[], 则使用转义符‘\’ 例如: re.search("[fen\]]", '2s4]*88(s9rghe') 匹配结果:] |
| | A|B 匹配按照A或B规则, 一旦A匹配了,B不在匹配 |
(...) | 匹配括号内的匹配规则 例如 re.search("(8{2})", '2s4*88(s9rg)he') 匹配连续两个8,匹配结果为88 (re.search("(...)", '2s4*88(s9rg)he') 匹配三个任意字符串,匹配结果为2s4 因为()为关键字符,所以要匹配(), 有两种方法1:\( 或\) 2:表达式[(].[)] 例子 re.search("[(].*[)]", '2s4]*88(s9rg)he') 匹配结果: (s9rg) re.search("\(.*\)", '2s4]*88(s9rg)he') 匹配结果:(s9rg) |
\number | 匹配number数量里面相同的内容 例如: print(re.search(r'(.+) \1', 'the the')) 匹配结果为the |
\A | 匹配字符串开始 re.search('\Athe', 'the number') 匹配结果the |
\b | 匹配一个单词边界,就是指单词空格间的位置 例如: re.search(r'\bfoo\b', 'bar foo baz') 匹配结果为foo re.search(r'\bfoo\b', 'fooq') 匹配结果为none |
\B | 匹配非单词边界 例如: re.search(r'foo\B', 'bar foobaz') 匹配结果为foo re.search(r'foo\B', 'bar foo baz') 匹配结果为none |
\d | 匹配任意数字,等于[0-9] 例如: re.search(r'\d', 'bar foo1baz') 匹配结果为1
|
\D | 匹配任意数字 例如: re.search(r'\D', '2135266') 匹配结果为none re.search(r'\D', '2135wd266') 匹配结果为w |
\s | 匹配任意空白字符,等价于 [\t\n\r\f] 例如: re.search(r'\s', '2135wd\n266') 匹配结果为\n re.search(r'\s', '2135wd\t266') 匹配结果为\t re.search(r'\s', '2135wd266') 匹配结果为none |
\S | 匹配任意空白字符 例如: re.search(r'\S', '2135wd266') 匹配结果为2 |
\w | 匹配数字字母下划线 例如 re.search(r'\w', '!@#$_qq') 匹配结果为_ |
\W | 匹配非数字字母下划线 例如: re.search(r'\W', '!@#$_qq') 匹配结果! re.search(r'\W', 'qwdwqd') 匹配结果为q |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 例如: re.search(r'number\Z', 'the number') 匹配结果为none |