正则表达式
正则表达式
目录
- 什么是正则表达式
- 正则表达式——字符组
- 正则表达式——特殊符号
- 正则表达式——量词
- 贪婪匹配和非贪婪匹配
- 取消转义
- 正则表达式的实用
什么是正则表达式
正则表达式线上测试网址:http://tool.chinaz.com/regex/
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式不属于任何一门编程语言,而是一个独立的学科,主要用于数据的查找和筛选
事例:手机号的输入
# 需求:编写代码校验用户输入的手机号是否合法
# 常见 13 15 17 18 19
phone_num = input('请输入手机号:').strip()
if phone_num.isdigit():
if len(phone_num) == 11:
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith('17') or phone_num.startswith('18') or phone_num.startswith('19'):
print('手机号格式正确')
else:
print('没有此开头的手机号')
else:
print('手机号位数不对')
else:
print('手机号必须为纯数字')
2.正则表达式
import re
phone_num = input('请输入你的手机号:').strip()
if re.match('^[13|15|17|18|19][0-9]{9}',phone_num):
print(phone_num)
else:
print('你个混球玩应,瞎输什么')
正则表达式本质上就是使用一些符号的组合产生一些特殊的含义
然后去字符串中筛选出符合条件的数据
字符组
字符组在没有量词修饰的情况一次只会针对一个数据值
字符组 | 匹配 | 全部 |
---|---|---|
[0-9] | 匹配0-9中的任意一个数字(包括0和9) | [0123456789] |
[a-z] | 匹配a-z之间的任意一个字母 | 26小写字母 |
[A-Z] | 匹配A-Z之间的任意一个大写字母 | 26个大写字母 |
[0-9a-zA-Z] | 数字、小写字母、大写字母 |
特殊符号
特殊符号 | 匹配 |
---|---|
. | 匹配换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\W | 匹配非字母或数字或下划线 |
\d | 匹配数字 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
^ 数值$ | ^和$组合能够明确的限制想要查找的具体数据 |
a|b | 匹配字符a或者字符b(管道符在很多场景下的意思都是或) |
( ) | 给正则表达式分组 不影响正则表达式的匹配 |
[ ] | 匹配字符组中的字符 |
[^ ] | 匹配除了字符组中字符的所有字符 |
特殊符号在没有量词修饰的情况一个符号一次只会针对一个数据值
量词
量词不能单独使用 必须跟在表达式的后面 并且只能影响紧挨着的左边那一个
量词 | 用法 |
---|---|
* | 重复0次或多次(默认为多次) |
+ | 重复一次或多次(默认为多次) |
? | 默认为0次或一次(默认为一次) |
重复n次 | |
重复n次或更多次 | |
重复n-m次 |
在正则表达式中所有的量词默认都是贪婪匹配(尽可能多的)
练习题
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
海. | 海燕海娇海东 | 海燕海娇海东 | 匹配所有"海."的字符 |
^海. | 海燕海娇海东 | 海燕 | 只从开头匹配"海." |
海.$ | 海燕海娇海东 | 海东 | 只匹配结尾的"海.$" |
李.? |
李杰和李莲英和李二棍子 |
李杰 李莲 李二 |
?表示重复零次或一次 即只匹配"李"后面一个任意字符 |
李.* | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | 匹配"李"后面0或多个任意字符 |
李.+ | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | 只匹配"李"后面1个或多个任意字符 |
李. |
李杰和李莲英和李二棍子 |
李杰和 李莲英 李二棍 |
{1,2}匹配"李"后面1到2次任意字符 |
李[杰莲英二棍子]* |
李杰和李莲英和李二棍子 |
李杰和 李莲英 李二棍子 |
表示匹配"李"字后面 [杰莲英二棍子]的字符任意次 |
李[ ^ 和 ]* |
李杰和李莲英和李二棍子 |
李杰和 李莲英 李二棍子 |
表示匹配一个不是"和"的字符任意次 |
[\d] | 45bdha3 | 4 5 3 |
表示匹配任意一个数字,匹配到3个结果 |
[\d]+ | 45bdha3 | 45 3 |
表示匹配任意个数字,匹配到2个结果 |
前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
贪婪匹配和非贪婪匹配(惰性匹配)
正则表达式 | 待匹配文本 | 匹配结果 |
---|---|---|
<.*> (贪婪匹配) | '<'script> alert (123) </script'>' | '<'script>alert(123)></script'>' |
<.*?> (非贪婪匹配) | '<'script> alert (123) </script'>' | '<'script> '<'/script> |
所有的量词默认都是贪婪匹配 但是如果在量词的后面紧跟一个问号
那么就会变成非贪婪匹配
小技巧:以后我们在使用贪婪匹配或者非贪婪匹配的时候一般都是用.或者.?
并且结束的标志有上述符号左右两边添加的表达式决定
取消转义
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
\n |
\n |
Flase |
因为在正则表达式中\是有特殊意义的字符 所以要匹配\n本身,用表达式\n无法匹配 |
\ \n |
\n |
True |
转义\之后变成 \ \ 即可匹配 |
\ \ \ \ n |
\ \n |
True |
字符串中的''也需要转义 所以每一个字符串''又需要转义一次 |
r'\ \n' |
r'\n' |
True |
在字符串之前加r 让整个字符串不转义 |
正则表达式实例
常见的正则百度查找即可 我们需要做到的时候能够看到别人写的
能够完成基础的修改即可
常见的正则表达式的实例 | 相关使用方法 |
---|---|
编写校验用户手机号 | 0?(13|14|15|17|18|19)[0-9 ] |
编写校验用户身份证 | \d{17}[\d|x] | \d |
编写校验用户邮箱 | \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z] |
编写校验用户qq号 | [1-9] ([0-9]{5,11}) |
邮政编码 | \d |
可通过网页:正则表达式线上测试网址:http://tool.chinaz.com/regex/ 来查看其他相关使用方法