Python正则表达式的应用详解
目录
- 正则表达式的定义
- Python对正则表达式的支持
- 示例
- 例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成
- 例2:从字符串中找到与正则表达式匹配的部分
- 例3:从网页上获取新闻的标题和链接
- 例4:不良内容过滤
- 例5:用正则表达式拆分字符串
- 总结
正则表达式的定义
在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。
关于正则表达式的相关知识,大家可以阅读一篇非常有名的博文叫《正则表达式30分钟入门教程》,读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。
但不能匹配but / b1t / b_t等
但不能匹配love you
a.*?b
说明: 如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用\进行转义处理,例如想匹配小数点可以写成\.就可以了,因为直接写.会匹配任意字符;同理,想匹配圆括号必须写成\(和\),否则圆括号被视为正则表达式中的分组。
Python对正则表达式的支持
Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。
说明: 上面提到的re模块中的这些函数,实际开发中也可以用正则表达式对象的方法替代对这些函数的使用,如果一个正则表达式需要重复的使用,那么先通过compile函数编译正则表达式并创建出正则表达式对象无疑是更为明智的选择。
示例
例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成
方法一:通过compile编译正则表达式创建Pattern对象,通过给Pattern对象发消息实现匹配检查。
import re username = input('请输入用户名:') # 通过compile编译正则表达式创建Pattern对象 username_pattern = re.compile(r'^\w{6,20}$') print(type(username_pattern)) # 通过给Pattern对象发消息实现匹配检查 matcher = username_pattern.match(username) print(type(matcher)) if matcher is None: print('无效的用户名') else: print(matcher.group())
方法二:不创建正则表达式对象,直接调用函数进行匹配操作
username = input('请输入用户名:') matcher = re.fullmatch(r'\w{6,20}', username) #^是开始符,$是结束符 # matcher = re.match(r'^\w{6,20}$', username) if matcher is None: print('用户名不合法!!!') else: print(matcher) print(matcher.group())
匹配操作可以使用match函数,需要添加开始符号^和结束符号$表示匹配字符串的开始与结束;也可以使用fullmatch函数,正则表达式不用写开始符和结束符。上面在书写正则表达式时使用了“原始字符串”的写法。
例2:从字符串中找到与正则表达式匹配的部分
import re content = """报警电话:110,我们班是Python-2105班, 我的QQ是9597658,我的手机号是13811223344,谢谢!""" searcher = re.search(r'1[3-9]\d{9}', content) if not searcher: print('没有找到手机号') else: print(searcher.group())
匹配结果:
13811223344
import re content = """报警电话:110,我们班是Python-2105班, 我的QQ是9597658,我的手机号是13811223344,谢谢!""" pattern = re.compile(r'\d+') matcher = pattern.search(content) while matcher: print(matcher.group()) # 从上一次匹配成功的结束位置开始搜索 matcher = pattern.search(content, matcher.end())
匹配结果:
110
2105
9597658
13811223344
import re content = """报警电话:110,我们班是Python-2105班, 我的QQ是9597658,我的手机号是13811223344,谢谢!""" pattern = re.compile(r'\d+') results = pattern.findall(content) # 没有创建正则表达式对象时,也可以用这种方法 # results = re.findall(r'\d+', content) for result in results: print(result)
匹配结果:
110
2105
9597658
13811223344
例3:从网页上获取新闻的标题和链接
import re import requests resp = requests.get('https://www.sohu.com/') # .表示任意字符,+表示匹配一个或任意多个,?表示惰性匹配,尽可能短的匹配 pattern = re.compile(r'href="http.+?"') # 拿到搜狐首页 content = resp.text matcher = pattern.search(content) while matcher: print(matcher.group()[6:-1]) matcher = pattern.search(content, matcher.end()) pattern2 = re.compile(r'title=".+?"') title_list = pattern2.findall(content) for title in title_list: print(title[7:-1])
对于例3,不能使新闻的标题和链接对应起来,如果使用正则表达式捕获组,可以实现标题和链接的对应。
import re import requests resp = requests.get('https://www.sohu.com/') # 匹配整个a标签,但是只捕获()中的内容 ---> 正则表达式的捕获组 # .*连在一起就意味着任意数量的不包含换行的字符 pattern = re.compile(r'<a\s.*?href="(.+?)".*?title="(.+?)".*?>') content = resp.text results = pattern.findall(content) for href, title in results: print(title) if not href.startswith('https://www.sohu.com'): href = 'https://www.sohu.com' + href print(href)
例4:不良内容过滤
import re content = '你真是一个沙雕煞笔,Fuck you!' # pattern = re.compile(r'[傻沙煞][逼笔雕鄙]|马化腾|fuck|shit', flags=re.IGNORECASE) # modified_content = pattern.sub('*', content) # print(modified_content) # |表示分支 modified_content = re.sub(r'[傻沙煞][逼笔雕鄙]|fuck|shit', '*', content, flags=re.I) print(modified_content)
例5:用正则表达式拆分字符串
import re poem = '床前明月光,疑是地上霜,举头望明月,低头思故乡。' # sentences_list = re.split(r'[,。]', poem) # sentences_list = re.split(r',|。', poem) pattern = re.compile(r'[,。]') sentences_list = pattern.split(poem) # sentences_list = [sentence for sentence in sentences_list if sentence] # print(sentences_list) for sentence in sentences_list: print(sentence)
运行结果:
床前明月光
疑是地上霜
举头望明月
低头思故乡
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注hwidc的更多内容!
【来源:http://www.1234xp.com/hwgf.html 转载请保留连接】