python10——正则表达式
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))
(?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)