正则表达式知识总结

一、简介

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。测试领域的使用场景,经常用来匹配接口响应结果,断言日志信息等。

二、转义字符

\是转义字符,其后面的字符会代表不同的意思,转义字符主要有三个作用:

第一种,是为了匹配不方便显示的特殊字符,比如换行,tab符号等

第二种,正则中预先定义了一些代表特殊意义的字符,比如\w等
下表是一些常用转义字符:

语法说明
\n匹配换行符
\r匹配回车符
\t匹配制表符
\d匹配数字字符,0~9
\D匹配非数字字符
\w匹配任何一个字母或者数字或者下划线
\W匹配任何一个字母或者数字或者下划线以外的字符

三、字符集

有时我们需要匹配一类字符,字符集可以实现这个功能,字符集的语法用[]分隔,下面的代码能够匹配a或b或c

[abc]

如果要表示字符很多,可以使用-表示一个范围内的字符,下面两个功能相同

[0123456789]
[0-9]

在前面添加^,可表示非的意思,下面的代码能够匹配abc之外的任意字符

[^abc]

其实正则还内置了一些字符集,在上面的转义字符有提到,下面给出内置字符集对应的自定义字符集

  • \w = [0-9a-Z_]
  • \W = [^0-9a-Z_]
  • \d = [0-9]
  • \D = [^0-9]

例子:如果我想要搜寻 night或fight这两个单词时,可以发现到,其实她们有共通的 ‘?ight’ 存在,这个时候,我可以这样来搜寻:

[dx46507691@shell.ceshiren.com chrisworksapce]$ cat retest.txt 
tag lydebug ycdebug zydebug rfdebug
world
night
fight
[dx46507691@shell.ceshiren.com chrisworksapce]$ cat retest.txt | grep [fn]ight
night
fight
[dx46507691@shell.ceshiren.com chrisworksapce]$

字符类的反向选择 [^] ,如果想要搜索满足ight,但是又不想前面有个n,这时可以这样写

[dx46507691@shell.ceshiren.com chrisworksapce]$ cat retest.txt | grep [^n]ight
fight

备注:
. (小数点):代表『一定有一个任意字节』的意思;
* (星号):代表『重复前一个字符, 0 到无穷多次』的意思,为组合形态

四、量词

如果需要匹配多次某个字符,正则也提供了量词的功能,正则中的量词有多个,如?、+、*、{n}、{m,n}、{m,}

{n}匹配n次,比如a{2},匹配aa

{m, n}匹配m-n次,优先匹配n次,比如a{1,3},可以匹配aaa、aa、a

{m,}匹配m-∞次,优先匹配∞次,比如a{1,},可以匹配aaaa…

?匹配0次或1次,优先匹配1次,相当于{0,1}

+匹配1-n次,优先匹配n次,相当于{1,}

*匹配0-n次,优先匹配n次,相当于{0,}

正则默认和人心一样是贪婪的,也就是常说的贪婪模式,凡是表示范围的量词,都优先匹配上限而不是下限

a{1, 3} // 匹配字符串'aaa'的话,会匹配aaa而不是a

有时候这不是我们想要的结果,可以在量词后面加上?,就可以开启非贪婪模式

a{1, 3}? // 匹配字符串'aaa'的话,会匹配a而不是aaa

举例:我想要找出两个到五个 o 的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 \ 来让他失去特殊意义才行,可以这样写

# 找出两个到五个 o 的连续字串
[dx46507691@shell.ceshiren.com chrisworksapce]$ grep -n 'o\{2,5\}' retest.txt 
3:woorld
4:wooorld
9:good day
10:goood nice
11:gooood bye
12:goooood five

五、字符边界

有时我们会有边界的匹配要求,比如以xxx开头,以xxx结尾

^在[]外表示匹配行的开头,
^\d表示必须以数字开头

^abc // 可以匹配abc,但是不能匹配aabc

温馨提示:^在[]内表示反向选择

$表示匹配行的结尾

abc$ // 可以匹配abc,但是不能匹配abcc

\b表示匹配单词的边界

abc\b // 可以匹配 abc ,但是不能匹配 abcc

你可能注意到了,py也可以匹配’python’,但是加上^py$就变成了整行匹配,就只能匹配’py’了

六、选择表达式

有时我们想匹配x或者y,如果x和y是单个字符,可以使用字符集,[abc]可以匹配a或b或c,如果x和y是多个字符,字符集就无能为力了,此时就要用到分组

正则中用|来表示分组,a|b表示匹配a或者b的意思

123|456|789 // 匹配 123 或 456 或 789

七、分组与引用

分组是正则中非常强大的一个功能,可以让上面提到的量词作用于一组字符,而非单个字符,分组的语法是圆括号包裹(xxx)

(abc){2} // 匹配abcabc

所以(P|p)ython可以匹配’Python’或者’python’
分组不能放在[]中,分组中还可以使用选择表达式

(123|456){2} // 匹配 123123、456456、123456、456123

和分组相关的另一个概念是引用,比如在匹配html标签时,通常希望后面的xxx能够和前面保持一致
引用的语法是\数字,数字代表引用前面第几个捕获分组,注意非捕获分组不能被引用

<([a-z]+)><\/\1> // 可以匹配 `<span></span>` 或 `<div></div>`等

八、综合运用

例子1:匹配形如023-54579462这样带区号的电话号码。
正则表达式写法:\d{3}-\d{3,8}
解析:
1.1 \d{3}表示匹配3个数字,例如’010’;

1.2 - 由于’-‘是特殊字符,在正则表达式中,要用’'转义;

1.3 \d{3,8}表示3-8个数字,例如’1234567’

例子2:匹配一个数字、字母或者下划线
正则表达式写法:[0-9a-zA-Z_]

例子3:匹配至少由一个数字、字母或者下划线组成的字符串
正则表达式写法:[0-9a-zA-Z_]+

例子4:匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
正则表达式写法:[a-zA-Z_][0-9a-zA-Z_]*

九、正则在python中的使用

验证Email邮箱地址的正则表达式
正则表达式验证邮箱地址

邮箱@前缀的几种类型:

1、纯数字   123456@qq.com
2、纯字母      zhangsan@qq.com
3、字母数字混合  zhang123@qq.com
4、带点的      zhang.san@qq.com
5、带下划线     zhang_san@qq.com
6、带连接线    zhang-san@qq.com

邮箱@后缀的类型:
1、123456@qq.com
2、123456@vip.qq.com
*至少有两处单词
*顶级域名一般为2~4位(如cn、com、club)

默认前缀、后缀不以’_’、’-’、’.'结尾
脚本如下:

import re

'''
正则表达式验证邮箱地址

邮箱@前缀的几种类型:

1、纯数字         123456@qq.com
2、纯字母      zhangsan@qq.com
3、字母数字混合   zhang123@qq.com
4、带点的      zhang.san@qq.com
5、带下划线     zhang_san@qq.com
6、带连接线     zhang-san@qq.com

邮箱@后缀的类型:
1、123456@qq.com
2、123456@vip.qq.com
*至少有两处单词
*顶级域名一般为2~4位(如cn、com、club)

默认前缀、后缀不以'_'、'-'、'.'结尾,所以正则可以写成:
'''
def is_valid_email(addr):
    re_addr = r'^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+.)+[A-Za-z]{2,4}$'
    if not re.match(re_addr, addr):
        return False
    return True

# 测试:
assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr*bob@example.com')
print('test pass')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值