正则:
限定符与"?"的组合
符号 | 说明 |
---|---|
*? | 匹配零次或多次,且最短匹配 |
+? | 匹配一次或多次,且最短匹配 |
?? | 匹配一次或零次,且最短匹配 |
{m,n}? | 重复m此,且最短匹配 |
(? #…) | 正则表达式中的注释 |
(? P…) | 给分组命名,name表示分组的名称 |
(? p=name) | 使用名为name的分组 |
re模块的规则选项:
选项 | 说明 |
---|---|
I | 忽略大小写 |
L | 字符集本地化 |
M | 多行匹配 |
S | 使".“匹配包括”\n"在内的所有字符 |
X | 忽略正则表达式中的空白、换行,以便添加注释 |
1.re模块的findall()查找匹配
示例1:
import re
s="HELLO WORLD"
print re.findall(r"^hello",s) #[]
print re.findall(r"^hello",s,re.I) #HELLO
print re.findall("WORLD$",s) #WORLD
print re.findall(r"WORLD$",s,re.I)#WORLD
2.re模块的sub():字符串的替换
import re
s="hello world"
print re.sub("hello","hi",s) #hi world
print re.sub("hello","hi",s[-4:]) #由于s[-4:]没有找到hello,返回s[-4:]的内容orld
print re.sub("world","China",s[-5:]) #把字符串"world"替换为"China",输出结果:China
注意:sub()先创建变量s的拷贝,然后在拷贝中替换字符串,并不会改变变量s的内容
subn()功能与sub()相同,但是多返回1个值,即匹配后的替换次数
s="你好 WORLD2"
print "匹配字母数字:"+re.sub(r"\w","hi",s) #你好 hihihihihihi
print "替换次数:"+str(re.subn(r"\w","hi",s)[1])#替换次数6
3.电话号码匹配演示
import re
#匹配电话号码
tel1 = "0791-1234567"
tel3="010-12345678"
print re.findall(r"\d{4}-\d{7}",tel1)
tel2 = "(010)12345678"
#[\) -]?表示最多只能取")"或"-"其中之一
print re.findall(r"[\(]?\d{3}[\) -]?\d{8}|[\(]?\d{4}[\) -]?\d{7}",tel3)
正则表达式的解析非常费时,如果多次使用findall()的方式匹配字符串,搜索效率可能比较低。这时可以使用compile()函数进行预编译。
import re
s="1abc23def45"
p=re.compile(r"\d+")
print p.findall(s) #['1', '23', '45']
print p.pattern #输出当前使用的正则表达式\d+
4.演示group的使用:
import re
#正则表达式分组的解析
p=re.compile(r"(abc)\1")#定义一个分组(abc)在后面使用"\1"再次调用该分组
m=p.match("abcabcabc")
print m.group(0)
print m.group(1)
print m.group()