正则表达式
预定义字符集(可以写在字符集[…]中)
. 匹配除换行符“\n”外任意单个字符
\w 单词字符:[A-Za-z0-9]
\W 非单词字符:[^\w]
\s 空白符:[<空格>\t\r\n\f\v]
\S 非空白符[^\s]
\d 匹配数字:[0-9]
^开头$结尾
数量匹配:
* 匹配前一个字符0次或无限次
+ 匹配前一个字符一次或无限次
? 匹配前一个字符0次或一次
{m} 匹配前一个字符m次(abc{m},(abc){m})
{m,n} 匹配前一个字符m至n次
[a-zA-Z ] 匹配范围([^a-z] 取反)
#所有的特殊字符在字符集中都失去其原有的特殊含义
*? +? ?? {m,n}? 使* + ? {m,n}变为非贪婪模式
名称捕获(?P<name>…)
re模块的相关方法:
re.match(p,text) 只匹配开头的位置,返回一个match对象
re.search(p,text) 匹配到了p就返回,只返回第一个匹配到的
re.findall(p,text) 将匹配到的全返回,返回一个list
re.split(p,text) 以匹配到的字符为分隔符切割text,返回一个list
re.sub(p,s,text) 替换,将p匹配到的字符串替换为s
>>import re
>>text=”c++ python2 python3 perl ruby lua java php5 php7”
>>a=re.match(r’c\+\+’,text) #返回一个match对象(匹配c++)
>>a.group()
>>c++
>>a=re.match(r’java’,text) #必须从头匹配
>>a.group()
>>print a
>>None
>>a=re.findall(r’python’,text)
>>a
>>[‘python’,’python’] #返回一个列表
>>li=re.split(r’pe’,text)
>>li
>>[‘c++ python2 python3’,’rl ruby lua java php5 php7’]
>>text=”c++ python2 python3 perl ruby lua java php5 php7c++peeeo text hph”
>>re.findall(r’p[^0-9]*?’,text) #非贪婪模式
[‘p’,’p’,’p’,’p’,’p’,’p’,’p’,’p’,’p’]
命名分组
>> text=”c++ python2 python3 perl ruby lua java php5 php7c++peeeo text hph”
>>a=re.findall(r’(p[a-zA-Z]+) (0-9)’,text) #位置分组
>>a
>>[(‘python’,’2’),(‘python’,’3’),(‘php’,’5’),(‘php’,’7’)]
>>a=re.search(r’(?P<name>p[a-zA-Z]+) (?P<version>[0-9])’,text) #返回match对象
>>a.group()
python2
>>a.groupdict()
{‘name’:’python’,’version’:’2’}
编译模式
pattern=re.compile(p)先编译p模式,当正则表达式比较复杂的时候,会先编译,然后使用result=patter.match(text),就可以使用编译好的模式去匹配各种字符串了,性能会有所提升。
>>p=re.compile(r’(?P<name>p[a-zA-Z]+) (?P<version>[0-9])’)
>>a=p.search(“python333333”)
>>a.groupdict()
>>{‘name’:’python’,’version’:’3’}