一.正则表达式
什么是正则表达式:正则表达式是一种描述文本模式的语言,它用于匹配、搜索和替换文本中的字符序列。简单来说,正则表达式是一种用来描述字符串模式的规则。通过使用正则表达式,可以快速、高效地搜索、处理和替换特定形式的字符串。它在很多编程语言和应用程序中都得到了广泛的应用。
1. 字符
在正则表达式中,我们经常用到的有
字符:
. 匹配除了换行符的任意字符。
\w 匹配字母,数字和下划线。
\d 匹配所有数字
\n 匹配换行符
a|b 匹配a或b
() 匹配括号里的字符组
^ 匹配以什么开头
$ 匹配以什么结尾
[...]匹配字符组中的字符
[^...]匹配除了字符组的所有字符
补充:
2. 量词
在正则表达式中,量词用于指定一个模式可以出现的次数,他只会影响前一个字符(ab+)只能影响a,不能影响b。量词不可单独使用,必须配合表达式使用。
* 重复0次或多次
+ 重复1次或多次
? 重复0次或者1次
{n} 重复执行n次
{n,} 重复执行n多更多
{n,m} 重复n至m
3. 贪婪与非贪婪匹配
贪婪匹配是指在正则表达式中采用的一种匹配策略,即会尽可能地匹配更多的字符
在满足条件时,会尽可能的匹配多个值。
# 待匹配的文本
<script>hello</script># 正则
<.*>
# <script>
# <script>hello</script>
取消贪婪匹
配的关键词:<.*>. 任意字符
* 重复0次至无数次
? 是非贪婪模式
组合在一起<.*>就是尽可能的匹配少的字符,.*?x ,意思就是去前面任意的长度,直到x停止。
实列
{n,m} ^[1-9]\d{13,16}[0-9x]$ ^[1-9]\d{13,16}[0-9x]$ ^[1-9]\d{14}(\d{2}[0-9x])?$ ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ # 对于常见的正则表达式,我们直接取百度搜索,实际编码中,我们可以写一些简单的正则. ##1. 手机号正则 : /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/##2 身份证的正则:"^[1-9]\\d{5}(19\\d{2})|(20[01]\\d)|(202[012])(((0[13578])|10|12)((0[1-9])|(([12][0-9])|30|31)))|(((0[469])|11)((0[1-9])|(([12][0-9])|30)))|(02((0[1-9])|([12][0-9])))//d{4}"
^[1-9]\d{13,16}[0-9x]$:意思为,只能是一到九开头的数字,后面的数字是13到16,之后0-9之间的数
4. 取消转义
在大多数正则表达式中,可以使用反斜杠(\)来转义字符。如果想要取消转义,可以使用两个反斜杠(\)来表示一个反斜杠字符本身。例如,如果想要匹配一个包含反斜杠的字符串,可以使用正则表达式
\\
来匹配一个反斜杠字符。但在python中,推荐使用\n ,\t \d等取消转义
二.re模块的常用方法
1. re模块的使用方法
re模块是Python中的正则表达式模块,用于匹配和处理字符串。
re模块中的主要函数包括:
- re.match():从字符串的开头匹配正则表达式。和search相同,不同的是在字符串开始处进行处理。
import re ret = re.match('a', 'jksdlab') print(ret) try: ret = re.match('a', 'jksdlab').group() print(ret) except Exception: print(ret) import re ret = re.match('a', 'asdlab').group() print(ret)##开头
- re.search():扫描整个字符串并返回第一个匹配的对象。只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。import re ret = re.search('ab', 'sk,eva,sdl,jhsj') print(ret)##None
- re.findall():返回字符串中所有的非重叠匹配项列表。re.findall('正则','待匹配的内容')待匹配内容一定是一个字符串,文本或空列表。如果匹配到内容则按照列表的形式返回,如果匹配不到,则返回空列表 [ ]。
import re ret = re.findall('a', 'ask,aklsl,sdl,dpowpa') print(ret)#[['a', 'a', 'a'] ]
- re.sub():用指定的替换字符串替换与正则表达式匹配的所有子字符串。
除了这些,re模块还提供了一些用于编写正则表达式的方法和特殊字符。
使用re模块可以方便地处理字符串,进行文本匹配、替换、分割等操作。
2. 无名分组和有名分组
1. 无名分组:使用小括号括起来的正则表达式就是无名分组
常用:
res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$', '110105199812067023') print(res) print(res.group()) # 110105199812067023 print(res.group(1)) # 10105199812067 print(res.group(2)) # 023 # findall针对分组优先展示 无名分组 """ 如果是findall,分组优先展示,无名分组 """ res = re.findall("^[1-9](\d{14})\d{2}[0-9x]?$",'110105199812067023') print(res) # ['023']
findal:优先进行无名分组的优先展示
2. 有名分组:
有名分组就是使用小括号括起来的正则表达式,然后给命名,就是有名分组
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023') print(res) print(res.group(1)) print(res.group(2)) print(res.group('xxx')) print(res.group('ooo'))
分类案列:
爬取红牛分公司官网数据
import re with open('red bull.txt','r', encoding='utf-8')as f: date = f.read() title_list = re.findall('<h2>(.*?)/h2>', date) address_list = re.findall("<p class='mapIco'>(.*?)</p>", date) email = re.findall("<p class='mailIco'>(.*?)</p>", date) phone = re.findall("<p class='telIco'>(.*?)</p>", date) res_list = zip(title_list, address_list, email, phone) for i in list(res_list): print(""" 公司名称: %s 公司地址: %s 公司邮箱:%s 公司电话:%s """ % (i[0], i[1], i[2], i[3]))