正则表达式

正则表达式

目录

  • 什么是正则表达式
  • 正则表达式——字符组
  • 正则表达式——特殊符号
  • 正则表达式——量词
  • 贪婪匹配和非贪婪匹配
  • 取消转义
  • 正则表达式的实用

什么是正则表达式

正则表达式线上测试网址: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/ 来查看其他相关使用方法

posted @ 2022-07-19 16:33  Nirvana*  阅读(19)  评论(0)    收藏  举报