为什么引入正则表达式?
- 用来匹配一类具有相同规则的字符串
正则分正则替换和正则匹配
规则:
PS:不要试图去看懂别人的正则,在一个特定的情况下我们只需自己完成自己需求的功能就好了 - 单字符:
【.】: 除换行以外所有的字符
【[ ]】:[aoe], [a-w]匹配集合中任意一个字符
【\d】:数字0~9
【\D】:非数字
【\w】:数字,字母,下划线,中文
【\W】:非\w
【\s】:所有的空白字符
【\S】:非空白 - 数量修饰(控制次数)
【*】:任意多次 >=0
【+】:至少一次 >=1
【?】: 可有可无 0次或者1次
【{m}】:固定m次
【{m,}】:至少m次
【{m,n}】:m到n次 - 边界
【\b】
【\B】
【$】:以某某结尾
【^】:以某某开头 - 分组
【()】视为一个整体 (){4}--->ab{4}和(ab){4}区别
【()】子模式 \组模式 \1 \2
import re
string='<p><div><span>猪八戒</span></div></p>'
pattern=re.compile(r'<(\w+)><(\w+)>\w+</\2></\1>')
ret=pattern.search(string)
print(ret)
显示:
<re.Match object; span=(3, 30), match='<div><span>猪八戒</span></div>'>
[Finished in 0.1s]
- 贪婪模式
【.*?】
【.+?】
import re
string='<div>如来佛祖</div></div></div>'
pattern=re.compile(r'<div>.*</div>')
ret=pattern.search(string)
print(ret)
匹配显示:
match='<div>如来佛祖</div></div></div>'>
加?后
import re
string='<div>如来佛祖</div></div></div>'
pattern=re.compile(r'<div>.*?</div>')
ret=pattern.search(string)
print(ret)
匹配显示:
match='<div>如来佛祖</div>'>
- 其他
- re.I :忽略大小写
- re.M :多行匹配
import re
string='''hate is beautiful feel
love you very much
love she
love her'''
pattern=re.compile(r'^love',re.M)
ret=pattern.search(string) #search方法只能找到一个
print(ret)
显示:
match='love'>
想显示多个用findall
ret=pattern.findall(string) #search方法只能找到一个
显示:
['love', 'love', 'love']
- re.S :单行匹配
举例:
import re
string='''<div>沁园春-雪
北国风光
千里冰封
万里雪飘
望长城内外
惟余莽莽
大河上下
顿失滔滔
山舞银蛇
原驰蜡像
欲与天公试比高
</div>'''
pattern=re.compile(r'<div>(.*?)</div>',re.S)
ret=pattern.findall(string)
print(ret)
显示:
['沁园春-雪\n北国风光\n千里冰封\n万里雪飘\n望长城内外\n惟余莽莽\n大河上下\n顿失滔滔\n山舞银蛇\n原驰蜡像\n欲与天公试比高\n']
[Finished in 0.1s]
匹配OK
假如把这句:
pattern=re.compile(r'<div>(.*?)</div>',re.S)
换成:
pattern=re.compile(r'<div>(\w+)</div>',re.S)
匹配失败:
[]
[Finished in 0.1s]
原因是\w+不能匹配换行符
pattern=re.compile(r'<div>(.*?)</div>',re.S)
这一句后面的re.S不加也会fail,加了后 . 点也可以匹配换行(点的含义是能匹配任何除换行以外的任何字符。加了re.S后可以匹配换行符)
- 匹配用到函数
match :只从最开始开始找
search:从任意位置开始找
findall:查找所有 - 正则替换
re.sub(正则表达式,替换内容,字符串)
含义:在’字符串‘中查找‘正则匹配’到的内容替换为‘替换内容’
import re
string='i love you,you love me,ye'
pattern=re.compile(r'love')
ret=re.sub(r'love','hate',string)
# ret=re.sub(pattern,'hate',string)
# ret=pattern.sub('hate',string)#把love替换成hate
print(ret)
显示:
i hate you,you hate me,ye
[Finished in 0.1s]
替换内容可以是函数:
解释下:
正则匹配到的内容会传递给这个函数,这个函数里面可以对它进行处理,最后这个函数必须返回一个字符串,这个字符串就是正则替换的内容
举例:把175升高减10用正则替换函数实现
import re
string='我喜欢升高为175的女孩'
def fn(a):
# print(a) #这个是正则匹配到的对象
ret=int(a.group(0))
return str(ret - 10)
pattern=re.compile(r'\d+')
ret=pattern.sub(fn,string)
print(ret)
打印显示:
我喜欢升高为165的女孩
[Finished in 0.1s]
网友评论