1.正则表达式:
通常被用来检索、替换那些符合某个模式的文本。
python中增加了re模块,提供了perl风格的正则表达式模式。
2.re模块
re.match(pattern,string,flag)
pattern——匹配的正则表达式
string——要匹配的字符串
flag——匹配方式:re.I 匹配对大小写不敏感;
re.M 多行匹配;
re.S 使.匹配包括换行在内的所有字符;
import re
str = 'Python is the best language in the world'
# match只能匹配以xxx开头的子符串,第一个参数是正则,第二个参数是需要匹配的字符串
res = re.match('pyt' ,str,re.I)
print(res.group()) #匹配成功使用group方法取出字符串
import re
str = 'Python is the best language in the world'
res = re.match('(.*) is (.*?) .*',str,re.I|re.M)
print(res.group(1)) #匹配成功使用group方法取出字符串
print(res.groups(1)) #匹配成功使用groups方法取出字符串,返回一个包含所有小组字符串的元组
常用的匹配规则:
①匹配字符
. 匹配任意1个字符,除了换行符\n
import re
data = 'a1aaa'
parrtern='...'
res=re.match(parrtern,data)
print(res.group())
#输出a1a
names='李明','小王','李达','小花','小王'
pa='李.'
for i in names:
r=re.match(pa,i)
if r:
print(r.group())
[abc] 匹配abc中的任意一个字符
import re
str1='elloh'
res=re.match('[he]',str1) #简写[a-z]
print(res.group()) #输出e
\d 匹配一个数字,即0-9
import re
str='123214loh'
print(re.match('\d',str).group())
\D 匹配非数字,即不是数字
import re
str='aa23214loh'
print(re.match('\D',str).group())
\s 匹配空白,即空格,tab键
\S 匹配非空白,除空格,tab键
\w 匹配单词字符,及a-z,A-Z,0-9
\W 匹配非单词字符
②匹配数量
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
\? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{n,m} 匹配前一个字符出现从n到m次
import re
res=re.match('[A-Z][A-Z]*','My')
print(res.group()) #输出M
import re
res=re.match('[A-Z][a-z]*','Myy')
print(res.group()) #输出Myy
③转义字符
在python正则中若想表示\本身,应该\\ 或者在前面加r表示不转义
a='F:\\test\\a.txt'
print(a)
a=r'F:\test\a.txt'
print(a)
④开头结尾
^ 匹配字符串开头
import re
result=re.match('^P.*','Python is langage')
if result:
print(result.group())
$ 匹配字符串结尾
import re
result=re.match('[\w]{5,15}@[\w]{2,3}.com$','aaaaaaaaa@163.com')
if result:
print(result.group())
⑤分组匹配
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
import re
ret= re.match('([0-9]*)-(\d*)','0355-85435456')
print(ret.group())
\num 引用分组num匹配到的字符串
import re
htmlTag='<html><h1>测试数据</h1></html>'
res=re.match(r'<(.+)><(.+)>(.+)</\2></\1>',htmlTag)
print(res.group(1))
print(res.group(2))
print(res.group(3))
View Code
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
import re
ret=re.match(r'<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>','<div><h1>www.baidu.com</h1></div>')
print(ret.group())
re.compile方法
reg=re.compile(pattern)
result=reg.match(string)
等效于result=re.match(pattern,string)
import re
reobj=re.compile('\d{4}')
#开始去使用模式对象reobj
rs=reobj.match('12346')
print(rs.group())
re.search方法
在全文中匹配一次,匹配到就返回
import re
data='我爱伟大的祖国,I love china, China is a great country'
rs=re.search('china',data)
print(rs.group())
re.findall方法
匹配所有返回一个列表
import re
data='华为是华人的骄傲华侨'
rs=re.findall('华.',data)
rsearch=re.search('华.',data)
print(rs) #输出 ['华为', '华人', '华侨']
print(rsearch) #输出<re.Match object; span=(0, 2), match='华为'>
re.sub方法
将匹配到的数据进行替换
import re
ret=re.sub("h","H" ,'hello world') #将原来的h替换为H
print(ret)
贪婪模式和非贪婪模式
数量词默认贪婪的,总是尝试匹配尽量多的字符,非贪婪则相反,总是尝试匹配尽可能少的字符。
在* ? + {m,n}后面加上?,使贪婪变成非贪婪
#贪婪模式匹配
re.match( '.*\d' , 'a22222').group() ##a22222
#加?号非贪婪模式
re.match( '.* ?\d','a11112').group() #a1
>>>
实操
1、'Save your heart for someone who cares'请使用正则将文本中的"s"替换成"S",请写Python代码完成匹配替换。
import re
#请使用正则将文本中的"s"替换成"S",请写Python代码完成匹配替换
txt=re.sub('s','S','Save your heart for someone who cares')
print(txt)
2、'<span三生三世,十里桃花</span><span>九州海上牧云记</span><span>莫斯科行动</span>'请使用正则将<span>标签中的全部内容匹配出来,请写Python代码完成匹配。
import re
data='<span>三生三世,十里桃花</span><span>九州海上牧云记</span><span>莫斯科行动</span>'
reobj=re.compile(r'<span>(.*)</span><span>(.*)</span><span>(.*)</span>')
result=reobj.findall(data)
print(result)