正则表达式和re模块的相关了解
-
正则表达式
-
re模块
一、正则表达式
1、什么叫正则表达式
正则表示式是一门可以匹配满足要求的字符串的技术,任何语言均可使用。
2、为什么要用正则表达式
用正常的代码去编写匹配一段很长的字符串的时候,代码量过大,不便于程序的运行;用正则表达式可以大大的简化匹配字符串的程序,让匹配过程变得简洁。
# 纯python代码校验 while True: phone_number = input('please input your phone number : ') if len(phone_number) == 11 \ and phone_number.isdigit()\ and (phone_number.startswith('13') \ or phone_number.startswith('14') \ or phone_number.startswith('15') \ or phone_number.startswith('18')): print('是合法的手机号码') else: print('不是合法的手机号码') # 正则表达式校验 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('不是合法的手机号码') # 可以看出,使用正则匹配电话号码的码量和逻辑关系远小于存python代码校验
正则表达式利用一些特定字符去匹配字符串。
字符组 : 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。
正则 待匹配字符 匹配 说明 [0123456789] 8 TRUE 在一个字符组里枚举合法的所有字符,字符组里的任意一个字符 [0123456789] a FALSE 由于字符组中没有"a"字符,所以不能匹配 [0-9] 7 TRUE 也可以用-表示范围,[0-9]就和[0123456789]是一个意思 [a-z] s TRUE 同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示 [A-Z] B TRUE [A-Z]就表示所有的大写字母 [0-9a-fA-F] e TRUE 可以匹配数字,大小写形式的a~f,用来验证十六进制字符
. 匹配除换行符(\n)以外所有字符 \w 匹配字母数字下划线 \s 匹配任意空白符 \d 匹配数字 \n 匹配换行符(\n) \t 匹配一个制表符 \b 匹配一个单词的结尾 ^ 匹配字符串的开始 $ 匹配字符串的结尾 \W 匹配除字母数字下划线外所有字符 \S 匹配除空白符外所有字符 \D 匹配除数字外所有字符 a|b 匹配字符a或b () 匹配括号内表达式,也表示一个组 [..] 匹配字符组中的字符 [^..] 匹配字符组总外的字符
* 重复0次或更多次 + 重复1次或更多次 ? 重复0次或1次 {n} 重复n次 {n,} 重复n次或多次 {n,m} 重复n次或m次
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
. 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式。 .*?x:就是取前面任意长度的字符,直到一个x出现
二、re模块
三个必须掌握的方法
-
-
search
-
match
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd'] ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个 print(ret) #evaHegon4yuan4 ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次) print(ret) obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123 import re ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果
import re res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023') res = re.search('^[1-9](?P<password>\d{14})(?P<username>\d{2}[0-9x])?$','110105199812067023') print(res.group()) print(res.group('password')) print(res.group(1)) print(res.group('username')) print(res.group(2)) print(res.group(2)) print(res.group(1))
import re ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') print(ret) # ['www.oldboy.com']
ret=re.split("\d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan") print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。
posted on 2019-07-17 22:11 so_interesting 阅读(117) 评论(0) 编辑 收藏 举报