1. 常见的函数
- re.match函数、re.search函数相比:search函数匹配的是全局的一次,而match是只匹配字符串的开始的一次,如果字符串开始不符合正则表达式,则匹配失败。
s="12abc345ab"
m=re.match(r'\d{3,}',s)
print m ## answer: None
m=re.search(r'\d{3,}',s)
print m.group() ## answer: 345
- re.sub函数、re.subn函数(返回一个元组 (新字符串,替换次数) )
s="2004-938-323 # 市第十三ds大师级 "
num=re.sub(pattern=r'#.*$', repl='', string=s) ## $表示字符的末尾,.*$表示匹配到末尾
print num ## answer: 2004-938-323
num=re.sub(pattern=r'\D', repl='', string=s) ## D表示非数字字符,大写的字母都是小写字母的反义
print num ## answer: 2004938323
num=re.sub(pattern=r'\d', repl='', string=s) ## d表示数字字符
print num ## answer: -- # 市第十三ds大师级
def replace_func(matched):
print matched.group()
return "*" * len(matched.group())
s = "abc,123,ef"
num = re.sub(pattern=r'[a-z]+', repl=replace_func, string=s)
print num
## answer: abc
## ef
## ***,123,**
- re.compile函数
- findall函数 (匹配的所有子串,并返回一个列表)
- re.split函数 (用pattern做分隔符切分字符串,分割后返回列表)
s = "dog,dog,cat. "
print re.split(r'\W+', s) ## pattern=\W 表示非字母数字及下划线
## answer: ['dog', 'dog', 'cat', '']
print re.split(r'(\W+)', s) ## (pattern)=(\W)表示连带分隔符一起返回
## answer:['dog', ',', 'dog', ',', 'cat', '. ', '']
小结一下: 函数re.finditer 、re.match、re.search 返回匹配对象,而findall、split返回列表。
2. re.compile函数(生成一个 Pattern 对象,也就是对正则表达式进行编译)
## match
pattern = re.compile(r"([a-z]+) ([a-z]+)", re.I)
m = pattern.match('hello nice world.')
print m.groups() ## answer: ('hello', 'nice')
print m.group() ## answer: hello nice
## sub
pattern = re.compile(r"(\w+) (\w+)") ## \w可以匹配一个字母或数字, ()表示一个分组
s = "ni 123, hao 456"
m = pattern.sub(r'\2 \1', s)
print m ## answer: 123 ni, 456 hao
小结:如果一个正则表达式要用多次,那么出于效率考虑,我们可以预先编译正则表达式,然后调用的一系列函数时复用。如果直接使用re.match、re.search等函数,则需要每一次都对正则表达式进行编译,效率就会降低。
3. 贪恋匹配
正则表达式匹配时默认的是贪恋匹配,也就是会尽可能多的匹配更多字符。如果想使用非贪恋匹配,可以在正则表达式中加上'?'。
s = 'ahello world bbbni hao ccc'
pattern = re.compile(r'.* ')
print pattern.findall(s) ## answer: ['hello world bbbni hao ']
pattern = re.compile(r'.*? ')
print pattern.findall(s) ## answer: ['hello world ', 'ni hao ']
4. 分组
如果你想要提取子串或是想要重复提取多个字符,那么你可以选择用定义分组的形式。用()就可以表示要提取的分组(group)。
pattern = re.compile(r'(\d{1,3}\.){3}\d{1,3}') ## '(\d{1,3}\.){3}'表示匹配一个长度为1到3之间的数字子串加上一个英文句号的字符串,重复匹配 3 次该字符串,'\d{1,3}'表示匹配一个1到3位的数字子串
s = 'ab123.456.78.90c'
print pattern.search(s).group() ## answer: 123.456.78.90
5. 正则表达式修饰符
- re.I :忽略大小写
- re.L :
- re.M:多行匹配
- re.S:单行匹配
- re.U:
- re.X:忽略多余空白字符
6. 常用语句
匹配中文表达式
pattern = re.compile(r'[^\u4e00-\u9fa5]+')
s = u'你好, hello, 世界 1'
print pattern.findall(s)
参考文献:
长文详解python正则表达式
廖雪峰正则表达式
字符串含义