python re正则表达式模块
模块的的作用主要是用于字符串和文本处理,查找,搜索,替换等
复习一下基本的正则表达式吧
.:匹配除了换行符以为的任意单个字符
*:匹配任意字符,一个,零个,多个都能匹配得到 俗称贪婪模式
+:匹配位于+之前的一个或者多个字符
|:匹配位于|之前或者之后的字符
^:匹配行首
$:匹配行尾
?:匹配位于?之前的零个或者一个字符,不匹配多个字符
\:表示 \ 之后的为转义字符
[]:匹配[]之中的任意单个字符,[0-9]表示匹配0到9任意一个数字
():将位于()之内的的内容当作一个整体
{}:按{}中的次数进行匹配,100[0-9]{3}表示在100之后任意匹配一个3位数(100-999)
python中以\开头的元字符:
转义字符 | 含义 |
\b | 匹配单词头或者单词尾 |
\B | 和\b含义相反 |
\d | 匹配任何数字 |
\D | 和\d含义相反,匹配任何非数字 |
\s | 匹配任何空白字符 |
\S | 和\s含义相反,匹配任何非空白字符 |
\w | 匹配任何字母,数字,下划线 |
\W | 匹配任何非字母,数字,下划线 |
匹配的标志和含义
标志 | 含义 |
re.I | 忽略大小写 |
re.L | 根据本地设置而更改\w,\W,\b,\B,\s,\S的匹配内容 |
re.M |
多行匹配模式 |
re.S | 使“.”元字符匹配换行符 |
re.U | 匹配Unicode字符 |
re.X | 忽略需要匹配模式中的空格,并且可以使用"#"号注释 |
文本内容(提取linux下的passwd文件)
1 man:x:6:12:man:/var/cache/man:/bin/nologin
re模块中有3个搜索函数,每个函数都接受3个参数(匹配模式,要匹配的字符串,进行匹配的标志),如果匹配到了就返回一个对象实例,么有就返会None.
findall():用于在字符串中查找符合正则表达式的字符串,并返回这些字符串的列表
search():搜索整个字符串,返回对象实例
match():只从第一个字符开始匹配,后面的不再匹配,返回对象实例
1 lovelinux@LoveLinux:~/py/boke$ cat text 2 man:x:6:12:man:/var/cache/man:/bin/sh 3 lovelinux@LoveLinux:~/py/boke$ cat test.py 4 #/usr/bin/env python 5 #coding:utf-8 6 import re 7 with open('text','r') as txt: 8 f = txt.read() 9 print re.match('bin',f) 10 print re.search('bin',f).end() 11 lovelinux@LoveLinux:~/py/boke$ python test.py 12 None 13 34 14 lovelinux@LoveLinux:~/py/boke$ vim test.py 15 lovelinux@LoveLinux:~/py/boke$ python test.py 16 None 17 <_sre.SRE_Match object at 0x7f12fc9f9ed0>
search()返回是对象实例有2个方法,
start():返回记录匹配到字符的开始索引
end():返回记录匹配到字符的结束索引
1 lovelinux@LoveLinux:~/py/boke$ python test.py 2 None 3 31 4 34 5 lovelinux@LoveLinux:~/py/boke$ cat test.py 6 #/usr/bin/env python 7 #coding:utf-8 8 import re 9 with open('text','r') as txt: 10 f = txt.read() 11 print re.match('bin',f) 12 print re.search('bin',f).start() 13 print re.search('bin',f).end()
findall():用于找找匹配的字符,把匹配到的字符作为数组返回
1 #!/usr/bin/env python 2 #coding:utf-8 3 import re 4 a = " man x 6 12 man / var /cache/man /bin/nologin" 5 print re.findall('[a-z]{3}\s', a) 6 7 输出结果: 8 ['man ', 'man ', 'var ', 'man ']
sub():用于替换,接受四个参数,sub(匹配模式,要替换成的内容,进行替换的字符串,最大的替换次数)最后一个为可选参数.返回替换后的字符串
把只有3个字母组成的单词替换成heihei,只替换前3个
1 #!/usr/bin/env python 2 #coding:utf-8 3 import re 4 a = " man x 6 12 man / var /cache/man /bin/nologin" 5 print re.sub('[a-z]{3}\s', 'heihei',a,3) 6 7 输出结果: 8 heiheix 6 12 heihei/ heihei/cache/man /bin/nologin
split():用于分割字符串,接受3个参数re.split(匹配模式,要分割的字符串,最大的分割次数),最后一个为可选参数,返回分割后的字符串列表
1 #!/usr/bin/env python 2 #coding:utf-8 3 import re 4 a = " man x 6 12 man / var /cache/man /bin/nologin" 5 print re.split('a', a) 6 7 输出结果: 8 [' m', 'n x 6 12 m', 'n / v', 'r /c', 'che/m', 'n /bin/nologin']
编译正则表达式
compile():编译正则表达式,返回一个正则对象实例,然后通过返回的对象实例对字符串进行查找替换,接受2个参数compile(正则表达式,匹配标志)
例子搜索web日志里面的IP
1 #!/usr/bin/env python 2 #coding:utf-8 3 import re 4 logstr = '192.168.1.56 - - [14/Apr/2014:01:33:06 -0400] "GET /favicon.ico HTTP/1.1" 404 571 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"' 5 r = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') 6 print r.findall(logstr) 7 8 输出结果: 9 ['192.168.1.56']