正则表达式
文章目录
什么是正则表达式
-
正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。
-
关于正则表达式的相关知识,大家可以阅读一篇非常有名的博文叫《正则表达式30分钟入门教程》,读完这篇文章后你就可以对正则表达式有个大概了解。
python中的正则表达式
在python中提供了re
模块来支持正则表达式相关操作。
python使用正则表达式的两种方式
-
不创建正则表达式对象,直接调用函数进行匹配操作
match
匹配 - 从头开始进行匹配search
搜索 - 从任意位置开始搜索fullmatch
完全匹配 -
创建正则表达式对象(Pattern),通过给对象发消息实现匹配操作
compile
-
group()
获取正则表达式匹配的字符串
不创建表达式直接调用函数
例:判断用户名是否合法
re.match('正则表达式',字符串)
import re
name = input('请输入用户名:')
matcher = re.match(r'\w{6,20}',name)#匹配6到20个字符 不满足则用户名不合法
if matcher is None:
print('用户名不合法')
else:
print(matcher.group())
#如果我们输入的是aaasddaaajjjjssssddddd
#则输出的是 aaasddaaajjjjssssddd
""可以看出 match函数在匹配不会出现错误后则返回匹配的字符
则上面输入的多出2个d 输出则少2个d 本来输入的用户名就不合法
但match 函数匹配过后判断是合法的"""
#修改办法
#把matcher = re.match(r'\w{6,20}',name)改为
#matcher = re.match(r'^\w{6,20}&',name)
"""^ 匹配字符串的开始
$ 匹配字符串的结束
这样写 ^\w{6,20}& 表示为必须是6~20位的用户名
"""
re.search('正则表达式',字符串)
同match一样需要^$ 但是它是任意位置开始查找
import re
name = input('请输入用户名:')
matcher = re.search('^\w{6,20}$',name)
if matcher is None:
print('不合法')
else:
print(matcher.group())
re.fullmatch('正则表达式',字符串)
同上,只不过不用标记Z^开始和$结束
import re
name = input('请输入用户名:')
matcher = re.fullmatch(r'\w{6,20}',name)#匹配6到20个字符 不满足则用户名不合法
if matcher is None:
print('用户名不合法')
else:
print(matcher.group())
match 与search的不同之处
match
- 匹配 - 从头开始进行匹配
不匹配则返回None
import re
content = """报警电话:110,我们班是Python-2105班,
我的QQ号是300814521,我的手机号是13765668199,谢谢!"""
matcher = re .match(r'1[3-9]\d{9}',content)
if not matcher:
print('没有找到手机号')
else:
print(matcher.group())
"""运行结果为 :没有找到手机号"""
"""原因是从头开始匹配
第一个是字符“报警电话“不匹配正则表达式所以会出现错误"""
search
搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
注意是第一次
如果想取出全部符合匹配的则看下面一段
import re
content = """报警电话:110,我们班是Python-2105班,
我的QQ号是300814521,我的手机号是13765668199,谢谢!"""
matcher = re .search(r'1[3-9]\d{9}',content)
if not matcher:
print('没有找到手机号')
else:
print(matcher.group())
创建正则表达式对象
对象=re.compile(正则表达式)
对象.方法(字符串)
例:查找全部数字
findall(字符串)
找出符合所有的装成一个列表
import re
content = """报警电话:110,我们班是Python-2105班,
我的QQ号是300814521,我的手机号是13765668199,谢谢!"""
#search创建对象
pattern = re.compile(r'\d+')
matcher = pattern.search(content)
whil matcher:
print(matcher.group())
print(matcher.start(),matcher.end())#开始结束位置
matcher = pattern.search(content, matcher.end())
# 第二种 创建对象
results = pattern.findall(content)#找出符合所有的装成一个列表
for result in results:
print(result)
#第三种 直接调用
results = re.findall(r'\d+',content)
for result in results:
print(result)
从网页上获取新闻的标题和链接
import requests
import re
pattern1 = re.compile(r'herf="http.+?“')
resp = requests.get('http.//www.sohu.com/')
content = resp.text
matcher = pattern1.search(content)
while matcher:
print(matcher.group()[6:-1])
matcher = pattern1.search(content, matcher.end())
pattern2 = re.compile(r'title=".+?"')
titles_list = pattern2.findall(content)
for title in titles_list:
print(title[7:-1])
同时获取标题和链接
import re
import requests
#匹配整个a标签,但是只捕获()中的内容 --->正则表达式的捕获组
pattren = re.compile(r'<a\s.*?href="(.+?)".*?title="(.+?)".*?>')
resp = requests.get('http.//www.sohu.com/')
results = pattren.findall(resp.text)
for href, title in results:
print(title)
if not href.startswitch('https://www.sohu.com'):
href = 'https://www.sohu.com'+ href
print(href)
不良内容过滤
sub(pattern, repl, string, count=0, flags=0)
用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count
指定替换的次数
import re
content = '马化腾是个傻逼'
modified_content = re.sub(r'[傻沙煞][逼笔雕壁]|马化腾|fuck','*',content)
print(modified_content)
content = '马化腾是一个沙雕煞笔,FUck you!'
pattern = re.compile(r'[傻沙煞][逼笔雕鄙]|马化腾|fuck|shit', flags=re.IGNORECASE)
# modified_content = re.sub(r'[傻沙煞][逼笔雕鄙]|马化腾|fuck|shit', '*', content, flags=re.I)
modified_content = pattern.sub('*', content)
print(modified_content)
用正则表达式拆分字符串
split(pattern, string, maxsplit=0, flags=0)
用正则表达式指定的模式分隔符拆分字符串 返回列表
import re
poem = '床前明月光,疑是地上霜。举头望明月,低头思故乡。'
# sentences_list = re.split(r',|。', poem)
# sentences_list = re.split(r'[,。]', poem)
pattern = re.compile(r'[,。]') #使用 , 或 。拆分
sentences_list = pattern.split(poem)
print(sentences_list)
sentences_list = [sentence for sentence in sentences_list if sentence]
print(sentences_list)
for sentence in sentences_list:
print(sentence)
总结
match
fullmatch
search
匹配单个字符时可以用直接调用,匹配多个字符时创建对象是因为有可以退循环的位置参数,findall
匹配多个字符时可以创建对象和直接调用。