正则表达式
正则表达式
-
正则表达式前夕
-
正则表达式之字符组
-
正则表达式之量词
-
正则表达式之特殊符号
-
正则表达式练习
-
正则表达式贪婪匹配和非贪婪匹配
-
正则表达式应用
-
python正则模块re
-
正则表达式前夕
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
1. 例如京东的注册页面,可以检测手机号的输入是否正确,这个功能如何实现
# 这里先不使用正则去使用python代码实现
# 京东注册页面实现手机号检测
# 1. 获取用户输入
usercode = input('请输入注册手机号: ')
# 2. 分析,手机号为11位,判断位数是否相等11
if len(usercode) == 11:
# 3. 判断用户输入的是否为纯数字
if usercode.isdigit():
# 4. 继续分析,手机号一般有很多开头,这里演示188开头
if usercode.startswith('188'):
print('验证通过')
else:
print('请输入正确的手机号')
else:
print('请输入数字')
else:
print('请输入正确的手机号长度')
# 代码执行结果,只有188开头的手机号码才可以通过注册
请输入注册手机号: 18800000000
验证通过
# 如果使用正则这个功能如何书写
import re
user_code = input('请输入手机号: ').strip()
if re.match('^188[0-9]{8}$', user_code):
print('合法的手机号')
else:
print('非法手机号码')
# 代码运行结果
请输入手机号: 18800000000
合法的手机号
# 接下来我们来学习如何使用正则表达式
- 正则表达式之字符组
1. 字符组内所有的数据默认都是或的关系
2. 字符组默认匹配规则是一个一个匹配
[0123456789] 匹配0到9任意一个数(全写)
[0-9] 匹配0到9任意一个数(缩写)
[a-z] 匹配26个小写英文字母
[A-Z] 匹配26个大写英文字母
[0-9a-zA-Z] 匹配数字或者小写字母或者大写字母
-
正则表达式常用特殊符号
特殊符号默认匹配方式是挨个匹配
| 正则符号 | 解释 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配数字,字母,下划线 |
| \W | 匹配非数字,非字母,非下划线 |
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的结尾 |
| | | 或的意思,类似于or,比如a|b,匹配a或者b |
| () | 给正则表达式分组,不影响表达式的匹配功能 |
| [] | 字符组内部填写的内容默认都是或的关系 |
| [^] | 取反操作 匹配除了字符组里面的其他所有字符 |
- 量词
-
正则表达式默认情况下都是贪婪匹配
量词必须结合表达式一起使用,不能单独出现,并且只影响左边第一个表达式
例如: Wesley\d{3} 只影响\d
| 正则符号 | 解释 |
|---|---|
| * | 匹配0次或者无穷次 |
| + | 匹配一次或者无穷次 |
| 重复n次 | |
| 重复n次或更多次 | |
| 重复n到m次,默认m次 |
- 贪婪匹配
所有的量词都是贪婪匹配,如果想更改为非贪婪匹配,只需要再量词后面加问号即可
1. 待匹配文本
<script>wesley(123)</script>
待使用的正则(贪婪匹配)
<.*>
匹配的内容为<script>wesley(123)</script> 一条数据
待使用的正则
<.*?>
匹配内容为 <script> </script> 2条内容
这里加了问号就相当于每一次匹配的结束条件为>
- 转义符
1. 在计算机中反斜杠组合的字母部分有特殊含义需要使用转义符转义
\n # \n代表换行符,若需要匹配则需要再次使用反斜杠转义
对\n进行转义\\n
2. 在python中可以取消转义的字符还有r,也是可以转义的
- 关于正则表达式使用建议
1.编写校验用户身份证号的正则
^[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})$
2.编写校验邮箱的正则
3.编写校验用户手机号的正则(座机、移动)
4.编写校验用户qq号的正则
"""
相对一复杂度一般,且常用的正则表达式,建议pytho开发者们,面对百度编程
"""
- re模块
- 如果在python中使用正则表达式,可以使用re模块
# 模块使用演示
# re模块的使用
import re
res = re.findall('a', 'java append as')
print(res)
# 结果,直接返回匹配到的实际,以列表的形式
['a', 'a', 'a', 'a']
res = re.finditer('a', 'java append as')
print(res)
# 结果,直接返回的是一个迭代器对象
<callable_iterator object at 0x104694910>
res = re.search('a', 'java append as')
print(res)
# 结果
<re.Match object; span=(1, 2), match='a'>
# 可以使用group查看
print(res.group())
# 结果 a group 匹配到一个就立刻结束
res = re.match('a', 'java append as')
print(res)
# match会匹配开头,若没有直接返回None
ojb = re.compile('\d{3}')
# 当某个正则经常使用时可以封装成模版
res1 = ojb.findall('123123u02913701294')
res2 = ojb.findall('j31l2k3jl12jl3k12jlk3j1l2j312312')
print(res1, res2)
# 结果
['123', '123', '029', '137', '012'] ['312', '312']
res = re.split('[ab]', 'abcd')
# 先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割
print(res) # ['', '', 'cd']
res = re.sub('\d', 'H', 'eva3jason4yuan5', 1)
# 将数字替换成'H',参数1表示只替换1个
print(res) # evaHjason4yuan5
res = re.subn('\d', 'H', 'eva3jason4yuan5')
# 将数字替换成H,返回元组(替换的结果,替换了多少次)
print(res) # ('evaHjasonHyuanH', 3)
- re模块补充说明
1. 分组优先
res = re.findall('www.(baidu|google).com') , www.baidu.com
print(res) # ['baidu']
# findall分组优先展示:优先展示括号内正则表达式匹配的内容
# 可以使用?:的方式取消这种优先展示
res = re.findall('www.(?:baidu|google).com', 'www.baidu.com')
print(res) # ['www.baidu.com']
2. res = re.search('www.(baidu|google).com', 'www.baidu.com')
print(res.group()) # www.baidu.com
3. res = re.match('www.(baidu|google).com', 'www.baidu.com')
print(res.group()) # www.baidu.com
- 分组别名
1. 可以通过分组和分组名还有索引来取值
res = re.search('www.(?P<content>baidu|google)(?P<hei>.com)', 'www.baidu.com')
print(res.group()) # www.baidu.com
print(res.group('content')) # baidu
print(res.group(0)) # www.oldboy.com
print(res.group(1)) # .com
print(res.group(hei)) # .com

浙公网安备 33010602011771号