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()
search():在所有的字符串中开始进行匹配,返回匹配到的第一个结果
例:
a = 'kjksajt3w9#53~59/35(*_dvds~r)3'
m = re.search("dvd",a)
m.group()
findall():返回所有匹配到的结果;返回一个列表
例:
a = 'kjksajt3w9#53~59/35(*_dvds~r)3'
re.findall("[a-zA-Z]+",a)
split():用匹配到的字符对字符串进行切割;返回一个列表
例:
a = 'kjksajt3w9#53~59/35(*_dvds~r)3'
re.split("\d+",a)
sub():把匹配到的内容进行替换,可以设定替换次数;返回替换后的结果
例:
a = 'kjksajt3w9#53~59/35(*_dvds~r)3'
re.sub('\d+',"|",a,count=3)
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())
groupdict():以命名方式匹配成功后,同时返回名字和匹配到的内容
例:
o = re.compile(r'(?P<name>\d+)')
m = o.search('127.0.0.1')
m.groupdict()
用正则匹配一条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'}
本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1892256如需转载请自行联系原作者
weilovepan520