(一) 什么是正则表达式
通俗理解:按照一定的规则,从某个字符串中匹配出想要的数据。这个规则就是正则表达式
(二)正则匹配在工作的运用
python的正则匹配模块在我们日常的工作中经常被运用到,比如说:爬虫,处理数据之间的依赖关系,提取海量数据等等,在测试也运用的比较广泛,比如接口测试,我们要处理接口的数据依赖关系,通常来说就是关联,目前可以通过python字典方式取值,同时也可以通过python的re模块正则表达式老解决该问题。运用的场景广泛,是一名测试人员必须掌握的知识点。
(三)python正则匹配案例
import re
# 匹配某一个字符:
text ='hello world'
ret = re.match('hello',text)
print(ret.group())
# 点(.)匹配任意的字符:
text ="abcd"
ret = re.match('.',text)
print(ret.group())
#\d匹配任意的数字:
text ='233445'
ret = re.match('\d',text)
print(ret.group())
#\D匹配任意的非数字:
text ='abcd'
ret = re.match('\D',text)
print(ret.group())
#\s匹配的是空字符(包括: \n, \t, \r 和空格):
text ="\t"
ret = re.match('\s',text)
print(ret.group())
#\w匹配的是a-z和A-Z以及数字和下划线
text ="_"
ret = re.match('\w',text)
print(ret.group())
#\W的匹配是和\w相反
text ="+"
ret = re.match('\W',text)
print(ret.group())
#[]组合的方式,只要满足中括号中的某一项都算匹配成功:
text ="7848-7837923"
ret = re.match('[\d\-]+',text)
print(ret.group())
#之前讲到的几种匹配规则,其实可以使用中括号的形式来进行替代:
# \d:[0-9]
# \D: 0-9
# \w:[0-9a-zA-Z]
# \W:[^0-9a-zA-Z]
#匹配多个字符:
text ="6348894"
ret = re.match('\d*',text)
print(ret.group())
#+:可以匹配1个或者多个字符。最少一个。示例代码如下:
text ="abcd"
ret = re.match('\w+',text)
print(ret.group())
# text =""
# ret =re.match('\w+',text)
# print(ret.group())
#?:匹配的字符可以出现一次或者不出现(0或者1)。示例代码如下:
text ="123"
ret = re.match('\d?',text)
print(ret.group())
# {m}: 匹配m个字符。示例代码如下
text ="123456"
ret = re.match('\d{5}',text)
print(ret.group())
#{m,n}: 匹配m-n个字符。在这中间的字符都可以匹配到。实例代码如下:
text ="1234556"
ret = re.match('\d{1,5}',text)
print(ret.group())
#案例验证手机号码:手机号码的规则是以1开头,第二位可以是345879,后面那9位就可以随意了。示例代码如下:
text ="15526236892"
ret = re.match('1[345879]\d{9}',text)
print(ret.group())
# 验证邮箱:邮箱的规则是邮箱名称是用数字,字母,下划线组成的,然后是@符号,后面就是域名了。示例代码如下:
text ="hynever@163.com"
ret = re.match('\w+@\w+\.[a-zA-Z\.]+',text)
print(ret.group())
text ="xiaolufei1101@163.com"
ret = re.match('\w+@\w+\.[0-9a-zA-Z]+',text)
print(ret.group())
#验证URL:URL的规则是前面的是http或者https或者是ftp然后再加上一个冒号,再加上一个斜杠,再后面就是可以出现任意非空白字符了。示例代码如下:
text ="https://www.google.com/"
ret = re.match('(http|https|ftp)://[^\s]+',text)
print(ret.group())
#验证身份证:身份证的规则是,总共有18位,前面17位都是数字,后面一位可以是数字,也可以是小写的x,也可以是大写的X。示例代码如下:
text ="431021199410014849"
ret = re.match('\d{17}[\dxX]',text)
print(ret.group())
# ^(脱字号):表示以..开始:
text ="hello world"
ret = re.match('^h',text)
print(ret.group())
# $:表示以...结束
# 匹配163.com的邮箱
text ="xxx@163.com"
ret = re.search('\w+@163\.com$',text)
print(ret.group())
#|:匹配多个表达式或者字符串:
text ="hello|world"
ret = re.search('hello',text)
print(ret.group())
#贪婪模式:正则表达式会匹配尽量多的字符。默认是贪婪模式。
#非贪婪模式:正则表达式会尽量少的匹配字符。
# 贪婪模式
text ="012345567789"
ret =re.match('\d+',text)
print(ret.group())
# 非贪婪模式
text ="08473847398479"
ret = re.match('\d+?',text)
print(ret.group())
# 匹配0-109之间的数字
text ='109'
ret = re.match('[1-9]?\d$|109$',text)
print(ret.group())
#转义字符和原生字符串:
#在正则表达式中,有些字符是有特殊意义的字符。因此如果想要匹配这些字符,那么就必须使用反斜杠进行转义。比如$代表的是以...结尾,如果想要匹配$,那么就必须使用\$。示例代码如下:
text ="apple price is \$99, orange paice is $88"
ret = re.search('\$(\d+)',text)
print(ret.group())
#原生字符串:
#在正则表达式中,\是专门用来做转义的。在Python中\也是用来做转义的。因此如果想要在普通的字符串中匹配出\,那么要给出四个\。示例代码如下:
text ="apple \c"
ret = re.search('\\\\c',text)
print(ret.group())
text ="apple \c"
ret = re.search(r'\\c',text)
print(ret.group())
# match:从开始的位置进行匹配。如果开始的位置没有匹配到。就直接失败了。示例代码如下:
text ='hello'
ret = re.match('h',text)
print(ret.group())
# 如果想要匹配换行的数据,那么就要传入一个flag=re.DOTALL,就可以匹配换行符了,代码示例:
text ="abc\nabc"
ret = re.match('abc.*abc', text, re.DOTALL)
print(ret.group())
# search:在字符串中找满足条件的字符。如果找到,就返回。说白了,就是只会找到第一个满足条件的
text ='apple price $99 orange price $88'
ret = re.search('\d+',text)
print(ret.group())
# 在正则表达式中,可以对过滤到的字符串进行分组。分组使用圆括号的方式。
# group:和group(0)是等价的,返回的是整个满足条件的字符串。
# groups:返回的是里面的子组。索引从1开始。
# group(1):返回的是第一个子组,可以传入多个。
text ="apple price is $99,orange price is $10"
ret = re.search(r".*(\$\d+).*(\$\d+)",text)
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
print(ret.groups())
参考资料:https://study.163.com/course/courseMain.htm?courseId=1004590003(知了课堂)