相关文章推荐
有腹肌的香烟  ·  javascript - How do I ...·  1 年前    · 
从未表白的墨镜  ·  Intent.EXTRA_ALLOW_MUL ...·  1 年前    · 
痴情的橙子  ·  Java8 ...·  1 年前    · 
完美的消炎药  ·  Java,Pattern.compile ...·  1 年前    · 

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)