Python基础篇---正则表达式和re模块
本章内容
• 正则表达式前戏
• 正则表达式
• 贪婪匹配和非贪婪匹配
• re模块
正则表达式前戏
我们日常生活中有很多地方都用到了正则表达式,比如说京东淘宝这类网页的注册页面需要获取手机号,而手机号的格式是有很多标准的,必须是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代码按照标准的逻辑编写是可以实现,但是很繁琐。正则表达式是一门独立的语言,专门用来匹配、校验、筛查所需的数据。下面我们用正则表达式实现校验手机号功能。
import re # 在python中如果想用就必须借助于内置模块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('不是合法的手机号码')
正则表达式就是利用一些'特殊符号'的组合去字符串中筛选出想要的数据。
正则表达式
| 字符组 | 功能描述 | 
| [0123456789] | 匹配0到9之间的任意一个数字 | 
| [0-9] | 匹配0到9之间的任意一个数字(简写) | 
| [a-z] | 匹配a到z之间的任意一个小写字母 | 
| [A-Z] | 匹配A到Z之间的任意一个大写字母 | 
| [0-9a-zA-Z] | 匹配任意一个数字或者大小写字母(没有顺序) | 
| 特殊符合 | 功能描述 | 
| . | 匹配除换行符以外的任意字符 | 
| \w | 匹配数字、字母、下划线(后续筛选变量名可能用到) | 
| \d | 匹配任意的数字 | 
| \t | 匹配一个制表符(tab键) | 
| ^ | 匹配字符串的开始 | 
| $ | 匹配字符串的结尾 | 
| \W | 匹配非字母或数字或下划线 | 
| \D | 匹配非数字 | 
| a|b | 匹配a或者b 管道符就是or(或)的意思 | 
| () | 给正则表达式分组 不影响正则匹配(后续再讲) | 
| [] | 字符组的概念(里面所有的数据都是或的关系) | 
| [^] | 上箭号出现在了中括号的里面意思是取反操作 | 
| 量词 | 功能描述 | 
| * | 重复零次或者多次(默认就是多次:越多越好) | 
| + | 重复一次或者多次(默认就是多次:越多越好) | 
| ? | 重复零次或者一次(默认就是一次:越多越好) | 
| {n} | 重复n次 | 
| {n,} | 重复最少n次最多多次(越多越好) | 
| {n,m} | 重复n到m次(越多越好) | 
正则表达式的例子:
# 校验用户身份证号码 ''' 身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x ''' ^[1-9][0-9]{14} # 开头是1到9的数字 后面14位又0到9的数字组成 ^[1-9][0-9]{16}[0-9x] 开头是1到9的数字 后面16位又0到9的数字组成,最后一个数字由0-9或x组成
PS:像校验邮箱、快递单号、座机号这种常见的正则表达式校验符合,直接百度查找就行,要求能看懂。
在python中还可以在字符串的前面加r取消转义,也可以在转义符前加\。例如:\\n转成\n,\\\n转成\\n。
贪婪匹配
| 正则表达式 | 待匹配的字符 | 结果 | 说明 | 
| <.*> | <script>alert(123)<script> | <script>alert(123)<script> | 量词默认都是贪婪匹配,会匹配尽量长的字符串 | 
非贪婪模式
| 正则表达式 | 待匹配的字符 | 结果 | 说明 | 
| <.*?> | <script>alert(123)<script> | <script> <script> | 加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串 | 
re模块
在python中无法直接使用正则 需要借助于模块---re模块。而导入re模块的方法有两种:
1.内置的re模块
  2.第三方的其他模块
findall()---所有
语法:re.findall("正则表达式", "要匹配的字符串")
# 代码示例 res = re.findall('a', 'jason oscar aaa') # findall(正则表达式,待匹配的文本) print(res) # ['a', 'a', 'a', 'a', 'a'] # 结果是所有符合条件的数据 并且组织成了列表
search()---单个
语法:search(正则表达式,待匹配的文本)
# 代码示例 res1 = re.search('a', 'jason oscar aaa') # search(正则表达式,待匹配的文本) print(res1) # <_sre.SRE_Match object; span=(1, 2), match='a'> 查找到一个符合条件的数据就结束 没有则返回None print(res1.group()) # a 没有则无法调用group() 直接报错
match()---匹配开头
语法:match(正则表达式,待匹配的文本)
import re res2 = re.match('j', 'jason oscar aaa') # match(正则表达式,待匹配的文本) print(res2) # <_sre.SRE_Match object; span=(0, 1), match='j'> 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束 print(res2.group()) # j 没有则无法调用group() 直接报错
finditer()---迭代器对象
语法:finditer(正则表达式,待匹配的文本)
# 代码实例 res3 = re.finditer('a', 'jason oscar aaa') # finditer(正则表达式,待匹配的文本) print(res3) # 结果是一个迭代器对象 为了节省空间 就是把findall转成迭代器对象 print([obj.group() for obj in res3]) # ['a', 'a', 'a', 'a', 'a']
compile()---编译一个正则表达式对象
语法:变量名=re.compile('正则表达式')
# 代码实例 obj = re.compile('\d+') # 提前写好后续需要经常使用的正则 print(re.findall(obj,'asjd21hj13123j')) # 写一遍之后 直接反复调用即可 print(re.findall(obj,'234328748hgjghj')) # 写一遍之后 直接反复调用即可 print(re.findall(obj,'jhjhjh423432423')) # 写一遍之后 直接反复调用即可

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号