正则表达式
一、正则表达式前戏(python中要导入re模块才能使用)
正则表达式是一门独立的技术,适用于所有的编程语言,它的主要作用就是利用一些特殊符号进行查找,可以对一些庞大的数据进行筛选。
举例:
当我们在登陆京东的网站时,需要输入手机号进行登陆,如果我们没有输入正确的手机号格式,就会出现错误提示,这些功能就是用正则表达式来实现的,虽然我们在用python语言的时候,也可以实现一样的功能,但是正则表达式更加方便高效。
以下是纯python代码实现手机号校验:
基本需求:手机号必须是11位、手机号必须以13 15 17 18 19开头、必须是纯数字
'''纯python代码实现'''
while True:
# 1.获取用户输入的手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.先判断是否是十一位
if len(phone_num) == 11:
# 3.再判断是否是纯数字
if phone_num.isdigit():
# 4.判断手机号的开头
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('手机号必须是11位')
'''python结合正则实现'''
import re
phone_number = input('please input your phone number: ')
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
二、正则表达式内容介绍
1、字符组
字符组是用于查找指定的字符,从左往右依次查找。通常来说,字符组中所有查找对象都是或的关系。
符号 | 说明 |
---|---|
[0123456789] | 匹配0到9任意一个数(全写) |
[0-9] | 匹配0到9任意一个数(缩写) |
[a-z] | 匹配26个小写英文字母 |
[A-Z] | 匹配26个大写英文字母 |
[0-9a-zA-Z] | 匹配数字或者小写字母或者大写字母 |
2、特殊符号
特殊符号默认匹配方式是挨个挨个匹配
符号 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配数字、字母、下划线 |
\W | 匹配非数字、非字母、非下划线 |
\d | 匹配数字 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
^和$符号,两者组合使用可以非常精确的限制匹配的内容。
符号 | 名称 |
---|---|
a|b | 匹配a或者b(管道符的意思是或) |
() | 给正则表达式分组 不影响表达式的匹配功能 |
[] | 字符组 内部填写的内容默认都是或的关系 |
[^] | 取反操作 匹配除了字符组里面的其他所有字符 |
ps:注意上尖号在中括号内和中括号意思完全不同
3、量词
符号 | 说明 |
---|---|
* | 匹配零次或多次 默认是多次(无穷次) |
+ | 匹配一次或多次 默认是多次(无穷次) |
? | 匹配零次或一次 作为量词意义不大主要用于非贪婪匹配 |
重复n次 | |
重复n次或更多次 默认是多次(无穷次) | |
重复n到m次 默认是m次 |
ps:量词必须结合表达式一起使用 不能单独出现 并且只影响左边第一个表达式
jason\d{3} 只影响\d
这里的正则表达式的意思是查找到jason字符并且在后面需要有三个数字
注:正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹配
4、贪婪匹配与非贪婪匹配
贪婪匹配
上面我们提到了所有的量词都是贪婪匹配,会尽可能多的获取可以匹配的内容。
非贪婪匹配
默认情况下量词使用的是贪婪匹配,但是我们在量词后面加上问号就可以把他由贪婪匹配变成非贪婪匹配。这个时候就会变成尽可能少的获取匹配的内容
待匹配的文本
<script>alert(123)</script>
待使用的正则(贪婪匹配)
<.*>
结果如下:
<script>alert(123)</script>
待使用的正则(非贪婪匹配)
<.*?>
结果如下:
<script>
</script>
5、转义符
当我们在正则表达式中使用\n这类内容的时候需要注意,这个时候我们是在查找换行符,当我们想要查找内容中的\n就需要在查找的表达式中使用\\n来查找,如果是有两个撬棍的就需要使用四个撬棍来查找,以此类推。同时,如果我们是在python中使用的话,可以在字符串前面加上r来取消符号的特殊意义。
\n 匹配的是换行符
\\n 匹配的是文本\n
\\\\n 匹配的是文本\\n
6、正则表达式实战建议与一些例子
建议
虽然这个正则表达式很使用,但是这并不意味着我们需要很全面的了解他,相反我们只是需要了解就可以,做到看到表达式能知道意思就足够了。
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号的正则
这些功能的正则表达式都已经在网上出现很多年了,虽然我们自己写的也能用,但我们会出现别人写的更好用的情况,因此我们也要学会前人栽树后人乘凉。
例子
1、. ^ $
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
海. | 海燕海娇海东 | 海燕海娇海东 | 匹配所有"海."的字符 |
^海. | 海燕海娇海东 | 海燕 | 只从开头匹配"海." |
海.$ | 海燕海娇海东 | 海东 | 只匹配结尾的"海.$" |
2、* + ? { }
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李.? | 李杰和李莲英和李二棍子 | 李杰 李莲 李二 | ?表示重复零次或一次,即只匹配"李"后面一个任意字符 |
李.* | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | *表示重复零次或多次,即匹配"李"后面0或多个任意字符 |
李.+ | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | +表示重复一次或多次,即只匹配"李"后面1个或多个任意字符 |
李. | 李杰和李莲英和李二棍子 | 李杰和 李莲英 李二棍 | {1,2}匹配1到2次任意字符 |
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李.*? | 李杰和李莲英和李二棍子 | 李 李 李 | 惰性匹配 |
3、字符集[][^]
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李[杰莲英二棍子]* | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 | 表示匹配"李"字后面[杰莲英二棍子]的字符任意次 |
李[^和]* | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 | 表示匹配一个不是"和"的字符任意次 |
[\d] | 456bdha3 | 4 5 6 3 | 表示匹配任意一个数字,匹配到4个结果 |
[\d]+ | 456bdha3 | 456 3 | 表示匹配任意个数字,匹配到2个结果 |
4、分组 ()与 或 |[^]
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
[1]\d{13,16}[0-9x]$ | 110101198001017032 | 110101198001017032 | 表示可以匹配一个正确的身份证号 |
[2]\d{13,16}[0-9x]$ | 1101011980010170 | 1101011980010170 | 表示也可以匹配这串数字,但这并不是一个正确的身份证号码,它是一个16位的数字 |
[3]\d{14}(\d{2}[0-9x])?$ | 1101011980010170 | False | 现在不会匹配错误的身份证号了()表示分组,将\d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次 |
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ | 110105199812067023 | 110105199812067023 | 表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14} |
5、转义符
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
\n | \n | False | 因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配 |
\n | \n | True | 转义\之后变成\\,即可匹配 |
"\\n" | '\n' | True | 如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次 |
r'\n' | r'\n' | True | 在字符串之前加r,让整个字符串不转义 |
6、贪婪匹配
几个常用的非贪婪匹配Pattern:
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复