import re

预定义字符集:

    \d:数字[0-9]

    \D:非数字[^\d]

    \s:空白字符[<空格>\t\r\n\f\v]

    \S:非空白字符[^\s]

    \w:单词字符[A-Za-z0-9_]

    \W:非单词字符[^\w]

匹配数量:

    .:匹配除换行符以外的任何单个字符

    *:匹配前一个字符0或无限次(尽可能多的匹配)

    *?:尽可能少的进行匹配前边的正则表达式

    +:匹配前一个字符1次或无限次(尽可能多的匹配)

    +?:尽可能少的进行匹配前边的正则表达式

    ?:匹配前一个字符0次或1次(尽可能多的匹配)

    ??:尽可能少的进行匹配前边的正则表达式

    {m}:匹配前一个字符m次

    {m,n}:匹配前一个字符m至n次(尽可能多的匹配)

    {m,n}?:尽可能少的进行匹配前边的正则表达式

    \:转义字符

    ?P<name>R:R表示为正则表达式,对正则表达式匹配到的内容进行命名

函数:

match():从字符串第一个字符开始匹配,直到不能匹配到为止,并返回匹配到的字符串;如果开头不能匹配则返回NoneType报错信息 

    例:

        a = 'kjksajt3w9#53~59/35(*_dvds~r)3'

        m = re.match("\w+",a)

        m.group()

        wKioL1h8XlqA5mQjAAAHBSO6k_8922.png

search():在所有的字符串中开始进行匹配,返回匹配到的第一个结果

    例:        

        a = 'kjksajt3w9#53~59/35(*_dvds~r)3'

        m = re.search("dvd",a)

        m.group()

        wKiom1h8XqHRW8cKAAAFgeJnvCo883.png

findall():返回所有匹配到的结果;返回一个列表

    例:        

        a = 'kjksajt3w9#53~59/35(*_dvds~r)3'

        re.findall("[a-zA-Z]+",a)

        wKioL1h8XuXBAKmNAAAJpgfGSd8545.png

split():用匹配到的字符对字符串进行切割;返回一个列表

    例:        

        a = 'kjksajt3w9#53~59/35(*_dvds~r)3'

        re.split("\d+",a)

        wKioL1h8XzTgyqREAAAJn9h0yDs284.png

sub():把匹配到的内容进行替换,可以设定替换次数;返回替换后的结果

    例:

        a = 'kjksajt3w9#53~59/35(*_dvds~r)3'

        re.sub('\d+',"|",a,count=3)

        wKioL1h8X3Gwhx1-AAAJCzEQ-10546.png

group():返回匹配到的结果,常跟在match和search之后

    例:

        a = 'kjksajt3w9#53~59/35(*_dvds~r)3'

        re.match("\w+",a).group()

        re.search("dvd",a).group()

compile():把正则表达式进行编译

    例:

        com = re.compile(r'\d+')  #r表示自然字符串,里边的字符不会被转义

        e = com.findall('ksdhfkjshdfjkwiu237yyy8w7ye782skdhfkj374ljhfk2')

        print(e)

        注:可以看到compile编译后返回一个对象,在进行大量匹配的时候,compile效率会更高

groups():分组,即只获取括号内的匹配到的数据;以元组的形式返回

    例:

        f = re.search('(\d+)hfkjshdfjkwiu(\d+)','ksd234234hfkjshdfjkwiu237yyy8w7ye782')

        print(f.groups())

        wKioL1h8YCyQeF5NAAAHWg1uhAY942.png

groupdict():以命名方式匹配成功后,同时返回名字和匹配到的内容

    例:

        o = re.compile(r'(?P<name>\d+)')

        m = o.search('127.0.0.1')

        m.groupdict()

        wKiom1h8YF-S9pI2AAAMUEU5Gmg184.png

用正则匹配一条nginx日志:

日志:

66.249.69.131 - - [10/Aug/2016:03:20:09 +0800] "GET /robots.txt HTTP/1.1" 404 162 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

匹配规则:

p = r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) .* .* \[(?P<time>.*)\] "(?P<method>\w+) (?P<url>[^\s]*) (?P<version>[\w|/\.\d]*)" (?P<status>\d{3}) (?P<length>\d+) "(?P<refer>[^\s]*)" "(?P<userAgent>.*)"'

匹配结果:

{'ip': '66.249.69.131',

 'length': '162',

 'method': 'GET',

 'refer': '-',

 'status': '404',

 'time': '10/Aug/2016:03:20:09 +0800',

 'url': '/robots.txt',

 'userAgent': 'Mozilla/5.0 (compatible; Googlebot/2.1; '

              '+http://www.google.com/bot.html)',

 'version': 'HTTP/1.1'}

wKioL1h8YPzTP9OTAAAblgmdijU933.png