正则表达式 re模块

今日内容概要

1.正则表达式前戏

2.正则表达式基本使用

3.正则表达式特殊符号

4.正则表达式量词

5.正则表达式贪婪与非贪婪匹配

6.正则表达式取消转义

7.python内置模块之re模块

 

 

今日内容详细

正则表达式前戏

# 京东注册页面获取手机号
有很多校验规则 必须是11位纯数字 并且必须是常规的手机号开头(13,15,17,18,19)
#上述的规则能否用python代码实现
phone_num = input('请输入您的手机号>>>:').strip()
if len(phone_num) == 11:
   if phone_num.isdigit():
       if phone_num.startswith('13') \
               or phone_num.startswith('15') \
               or phone_num.startswith('17') \
               or phone_num.startswith('18') \
               or phone_num.startswith('19'):
           print('是一个正确的11位手机号')
       else:
           print('手机号开头不合法')
   else:
       print('手机号必须是纯数字')
else:
   print('手机号必须是11位')
   

# 使用正则表达式
"""正则表达式实现手机校验功能"""

import re
phone_num = input('please input your phone number:').strip()
if re.match('^(13|14|15|18)[0-9]{9}$',phone_num):
   print('是合法的手机号码')
else:
   print('不是合法的手机号码')
   
"""
正则表达式是一门独立的语言 专门用来匹配,校验,筛查所需的数据
任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
就是用一些'特殊符号'的组合去字符串中筛选出想要的数据"""

正则表达式之字符组

正则表达式在线测试网:
http://tool.chinaz.com/regex/
"""单个字符组默认一次只匹配一个字符"""

[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(或者)的意思
()  给正则表达式分组 不影响正则匹配
[]  字符组的概念(里面所有的数据都是或者的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作

正则表达式之量词

"""
量词必须跟在表达式的后面 不能单独使用目的是增加匹配的字符数
"""
#注意量词默认都是贪婪匹配(尽可能多的匹配):后面详细的讲解
*  重复零次或者多次(默认就是多次:越多越好)
+  重复一次或者多次(默认就是多次:越多越好)
?  重复零次或者一次(默认就是一次:越多越好)
{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]

"""
校验邮箱,快递单号,座机号...
很多常见的正则校验符号 不需要我们编写 直接百度查找即可
"""
ps:百度的前提是自己能够看懂别人写的大致意思

取消转义

\n       \n false
\\n      \n true
\\\\n     \n true
在python中还可以在字符串的前面加r取消转义更加方便

贪婪匹配与非贪婪匹配

<.*>    <scrip>alert(123)
<scrip>   1条      贪婪匹配
      以最后一个大括号的出现作为结束标志
<.*?>   <scrip>alert(123)<scrip>
         2条   非贪婪匹配
      以第一个大括号的出现作为结束标志
       
量词默认都是贪婪匹配 如果想修改为非贪婪匹配只需要在量词的后面加上?即可

贪婪非贪婪通常都是利用左右两边的条件作为筛选依据

re模块

# 在python中无法直接使用正则 需要借助于模块
1.内置的re模块
2.第三方的其他模块

import re
res = re.findall('a','jason oscar aaa') # findall(正则表达式,待匹配的文本)
print(res)  # ['a', 'a', 'a', 'a', 'a'] 所有符合条件的数据 并且组织成了列表

res1 = re.search('a','jason oscar aaa')
print(res1) # <re.Match object; span=(1, 2), match='a'>
print(res1.group()) # a

res2 = re.match('j','jason oscar aaa')
print(res2) # <re.Match object; span=(0, 1), match='j'>
print(res2.group()) # j

res3 = re.finditer('a','jason oscar aaa')
print(res3) # <callable_iterator object at 0x000001CEAE3D9D90>
结果是一个迭代器对象 为了节省空间
print([i.group() for i in res3]) # ['a', 'a', 'a', 'a', 'a']

i = re.compile('\d+') # 提前写好后续需要经常使用的正则
print(re.findall(i,'fgbfj34jkttb5jk')) # ['34', '5']
print(re.findall(i,'jfbgkj489y64jhgt94i')) # ['489', '64', '94']
print(re.findall(i,'hgf854ytfu7h54utr')) # ['854', '7', '54']

 

 

posted @ 2022-03-28 16:57  顺溜_7  阅读(48)  评论(0编辑  收藏  举报