python正则表达式
import re
re模块使python表达式拥有全部的正则表达式功能。
re.match(pattern, string, flags=0) 从字符串的起始位置匹配字符串,如果不是起始位置匹配成功,则返回none.如果匹配成功,返回一个匹配的对象
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
re.search(pattern, string, flags=0)扫描整个字符串并返回第一个成功的匹配
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.search方法返回一个匹配的对象,否则返回None。
比如:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配 (0, 3)
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配 (11, 14)
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) # re.M多行模式 re.I 忽略大小写
if searchObj:
print "searchObj.group() : ", searchObj.group() #Cats are smarter than dogs
print "searchObj.group(1) : ", searchObj.group(1) #Cats
print "searchObj.group(2) : ", searchObj.group(2) #smarter
else:
print "Nothing found!!"
re.match和re.search的区别:
re.match只匹配字符串的开始,如果字符串的开始不符合正则表达式,则匹配失败,函数返回none。而re.search匹配整个字符串,直到找到一个匹配的。
例如:
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print "search --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
结果:
No match!!
search --> matchObj.group() : dogs
检索和替换:re模块的re.sub用于替换字符串中的匹配项
re.sub(pattern, repl, string, count=0, flags=0)
pattern:正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string:要被查找替换的原始字符串。
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num # 电话号码是 : 2004-959-559
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone) # \D匹配任意非数字
print "电话号码是 : ", num # 电话号码是 : 2004959559
repl是一个函数
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义
^匹配字符串的开头
$匹配字符串的结尾
. 匹配任意字符,除了换行符
[......] 用来表示一组字符,单独列出 [amk] 匹配 'a','m'或'k'
[^......] 不在[ ] 中的字符 [^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个表达式
re+ 匹配1个或多个表达式
\d 匹配任意数字
\D 匹配任意非数字
\s 匹配任意空白字符 等价于 [\t\n\r\f].
\S 匹配任意非空字符
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
r'(.*) are (.*?) .*' 首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。
(.*) 第一个匹配分组,.* 代表匹配除换行符之外的所有字符。
(.*?) 第二个匹配分组,.*? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符
后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。
matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的
matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的
因为只有匹配结果中只有两组,所以如果填 3 时会报错。