day03.38正则表达式
引言:
用python代码编写一个注册界面手机号的校验功能。
# 京东注册页面获取手机号 ''' 有很多校验规则 必须是11位的纯数字 并且必须是常规的手机号开头(13, 15, 17, 18, 19) ''' # 上述的规则能否使用python代码实现 '''python实现手机校验功能''' # 1.获取用户的手机号 phone_num = input('请输入您的手机号>>>:').strip() # 2.先校验是否是11位 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'): print('是一个正常的手机号') else: print('手机号开头不合法') else: print('手机号必须是纯数字') else: print('手机号必须是11位')
python程序代码虽然实现了注册界面的手机号的校验功能,但是程序代码很冗长,因此需要一个简便高效的方法实现校验功能。这就引入了正则表达式。
正则表达式:
利用一些‘特殊符号’的组合,去字符串中筛选出想要的数据。
''' 正则表达式是一门独立的语言,专门用来匹配、校验、筛查所需的数据。 任何编程语言都可以使用正则表达式;在python中如果想用就必须借助于内置模块re。 '''
如果使用正则表达式,注册界面的手机号校验功能的代码会得到极大的简化。
使用正则表达式的程序如下:
# 使用正则表达式完成注册界面的手机号的校验功能 import re phone_number = input('please input your phone number : ').strip() if re.match('^(13|14|15|18)[0-9]{9}$', phone_number): print('是合法的手机号码') else: print('不是合法的手机号码')
正则表达式之字符组
在线测试网站:http://tool.chinaz.com/regex/
ps:
- 单个字符组默认一次只匹配一个字符。
- 在匹配筛选查找数据的时候可以使用正则提供的符号也可以直接写目标数据。
| 字符组 | 作用 |
| [0123456789] | 匹配0到9之间的任意一个数字 |
| [0-9] | 匹配0到9之间的任意一个数字(简写方式) |
| [a-z] | 匹配a到z之间的任意一个小写字母 |
| [A-Z] | 匹配A到Z之间的任意一个大写字母 |
| [0-9a-zA-Z] | 匹配任意一个数字或者大小写字母(没有顺序) |
正则表达式之特殊符号
| 符号 | 作用 |
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配数字、字母、下划线(一般用于筛选变量名) |
| \d | 匹配任意的数字 |
| \t | 匹配一个制表符(tab键) |
| ^ | 匹配字符串的开始(eg:^9>>>找9并且这个9必须在开头) |
| $ | 匹配字符串的结尾(eg:9$>>>找9并且这个9必须在末尾) |
| \W | 匹配非字母或数字或下划线 |
| \D | 匹配非数字 |
| a|b | 匹配a或者b>>>管道符就是or(或)的意思 |
| () | 给正则表达式分组 不影响正则匹配 |
| [] | 字符组的概念(里面所有的数据都是或的关系) |
| [^] | 上箭号出现在了中括号的里面意思是取反操作 |
正则表达式之量词
量词必须跟在表达式的后面,不能单独使用,l量词的目的是增加匹配的字符数。
注意量词默认都是贪婪匹配(尽可能多的匹配)。
| 符号 | 作用 |
| * | 重复零次或者多次(默认就是多次:越多越好) |
| + | 重复一次或者多次(默认就是多次:越多越好) |
| ? | 重复零次或者一次(默认就是一次:越多越好) |
| {n} | 重复n次 |
| {n,} | 重复最少n次最多多次(越多越好) |
| {n,m} | 重复n到m次(越多越好) |
复杂的正则表达式编写
校验用户身份证号码:
# 身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x ^[1-9][0-9]{14} ^[1-9][0-9]{16}[0-9x]
校验邮箱、快递单号、座机号...:
"""很多常见的正则校验符号 不需要我们编写 直接百度查找即可""" ^[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})$
取消转义
\n \n False
\\n \n True
\\\\n \\n True
在python中还可以在字符串的前面加r取消转义 更加方便
贪婪匹配与非贪婪匹配
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据。
# 正则 # 待匹配的文本 # 结果 <.*> <script>alert(123)<script> 1条 # 贪婪匹配,以最后一个大括号的出现作为结束标志 <.*?> <script>alert(123)<script> 2条 # 非贪婪匹配,以第一个大括号的出现作为结束标志
ps:量词默认都是贪婪匹配,如果想修改为非贪婪匹配,只需要在量词的后面加'?'即可。
re模块
在python编辑器当中无法直接使用正则表达式,必须要借助模块才能使用。
模块又分为两种:一种是内置的re模块;另一种就是第三方模块。
- findall(正则表达式,待匹配的文本)
import re res = re.findall('a', 'jason oscar aaa') # findall(正则表达式,待匹配的文本) print(res) # ['a', 'a', 'a', 'a', 'a'] # 结果是所有符合条件的数据 并且组织成了列表
- search(正则表达式,待匹配的文本)
import re res1 = re.search('a', 'jason oscar aaa') # search(正则表达式,待匹配的文本) print(res1) # 查找到一个符合条件的数据就结束 没有则返回None print(res1.group()) # a 没有则无法调用group() 直接报错
- match(正则表达式,待匹配的文本)
import re res2 = re.match('j', 'jason oscar aaa') # match(正则表达式,待匹配的文本) print(res2) # None 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束 print(res2.group()) # j 没有则无法调用group() 直接报错
- finditer(正则表达式,待匹配的文本)
import re res3 = re.finditer('a', 'jason oscar aaa') # finditer(正则表达式,待匹配的文本) print(res3) # 结果是一个迭代器对象 为了节省空间 print([obj.group() for obj in res3]) # ['a', 'a', 'a', 'a', 'a']
- compile(正则表达式)
提前写好后续需要经常使用的正则,写好之后直接调用即可。
import re obj = re.compile('\d+') # 提前写好后续需要经常使用的正则 print(re.findall(obj, 'asjd21hj13123j')) # 写一遍之后 直接反复调用即可 print(re.findall(obj, '234328748hgjghj')) # 写一遍之后 直接反复调用即可 print(re.findall(obj, 'jhjhjh423432423')) # 写一遍之后 直接反复调用即可

浙公网安备 33010602011771号