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