http://www.runoob.com/python/python-reg-expressions.html
目标
- 正则表达式
- 正则表达式基本语法
- 正则表达式扩展语法
- re模块
- re.match
- re.search
- match与search
- re.sub
- re.compile
正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
正则表达式基本语法
正则表达式扩展语法
正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体对待,例如'(red)+'可以匹配'redred'、'redredred'等一个或多个重复'red'的情况。
使用子模式扩展语法可以实现更加复杂的字符串处理功能。
例子:
最简单的正则表达式是普通字符串,可以匹配自身
'[pjc]ython'可以匹配'python'、'jython'、'cython'
'[a-zA-Z0-9]'可以匹配一个任意大小写字母或数字
'[^abc]'可以一个匹配任意除'a'、'b'、'c'之外的字符
'python|perl'或'p(ython|erl)'都可以匹配'python'或'perl'
子模式后面加上问号表示可选。r'(http://)?(www.)?python.org'只能匹配'http://www.python.org'、'http://python.org'、'www.python.org'和'python.org'
'^http'只能匹配所有以'http'开头的字符串
(pattern)*:允许模式重复0次或多次
(pattern)+:允许模式重复1次或多次
(pattern){m,n}:允许模式重复m~n次
re模块
Python标准库re模块提供了正则表达式操作所需要的功能
重点掌握以下几个re.match re.search re.sub.re.compile
re.match
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern, string, flags=0)
实例
import re
print(re.match('www', 'www.runoob.com').span())
print(re.match('www', 'www.runoob.com').group())
print(re.match('www', 'www.runoob.com').start())
print(re.match('www', 'www.runoob.com').end())
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
输入结果
(0, 3)
www
0
3
None
match如果查找到结果, 将返回一个 MatchObject,你可以查询 MatchObject 关于匹配字符串的相关信息了。MatchObject 实例也有几个方法和属性;最重要的那些如下所示:
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
re.search
re.search 扫描整个字符串并返回第一个成功的匹配。
匹配成功re.search方法返回一个匹配的对象,否则返回None。
函数语法:
re.search(pattern, string, flags=0)
例子
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
打印结果
(0, 3)
(11, 14)
分组group/groups
可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
import re
line = "Cats are smarter than dogs";
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
if searchObj:
print("searchObj.group() : ", searchObj.group())
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.group(2) : ", searchObj.group(2))
print("groups : ", searchObj.groups())
else:
print( "Nothing found!!")
match与search
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.sub
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0)
前三个参数为必填项
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
实例
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
# 删除非数字(-)的字符串 \D是非数字
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
执行结果
电话号码是: 2004-959-559
电话号码是 : 2004959559
re.compile
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
例:
>>> import re
# 编译:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
建议自学:
re.split切分字符串
用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:
>>> 'a b c'.split(' ')
['a', 'b', '', '', 'c']
嗯,无法识别连续的空格,用正则表达式试试:
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
无论多少个空格都可以正常分割。加入,试试:
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
再加入;试试:
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']