首页 > 其他分享 >19正则/贪婪匹配/re模块

19正则/贪婪匹配/re模块

时间:2023-07-30 23:25:23浏览次数:25  
标签:匹配 19 re 正则 print 李二 李杰

正则表达式介绍

'''京东注册页面获取手机号
    有很多校验规则
      必须是11位的纯数字 并且必须是常规的手机号开头(13,15,17,18,19)
'''

#①用正常的代码编写
 # 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位')


#②正则表达式
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('不是合法的手机号码')

'''可以明显感受到用正则更加简单'''
#那么正则到底是什么呢?
""" 正则表达式是一门独立的语言 专门用来匹配、校验、筛查所需的数据 
任何编程语言都可以使用 在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次(越多越好)

课堂练习

# 表达式            文本                        结果
海.                  海燕海娇海东                   海燕/海娇/海东(3条)
^海.                 海燕海娇海东                   海燕(1条)
海.$                 海燕海娇海东                   海东(1条)
  
李.?                 李杰和李莲英和李二棍子         李杰/李莲/李二(3条)        
李.*                 李杰和李莲英和李二棍子         李杰和李莲英和李二棍子(1条)        
李.+                 李杰和李莲英和李二棍子         李杰和李莲英和李二棍子(1条)        
李.{1,2}             李杰和李莲英和李二棍子         李杰和/李莲英/李二棍(3条)         
  
李[杰莲英二棍子]*      李杰和李莲英和李二棍子          李杰/李莲英/和李二棍子(3条)
李[^和]*             李杰和李莲英和李二棍子          李杰/李莲英/李二棍子(3条)
  
\d+                  456bdha3                    456/3(2条)                            

复杂正则的编写

# 校验用户身份证号码
 身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
 ^[1-9][0-9]{14}
 ^[1-9][0-9]{16}[0-9x]
  
# 校验邮箱、快递单号、座机号...
    """很多常见的正则校验符号 不需要我们编写 直接百度查找即可"""

ps:百度的前提是自己能够看懂别人写的大致意思
      ^[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条       非贪婪匹配
        以第一个大括号的出现作为结束标志
  
量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可

贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
"""毕业的那一刻可能是你未来两三年之内技术的巅峰!!!"""

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')  # search(正则表达式,待匹配的文本)
print(res1)  # 查找到一个符合条件的数据就结束  没有则返回None
print(res1.group())  # a  没有则无法调用group() 直接报错(因为上面打印的是一串类似地址的东西,看不懂,需要group)

res2 = re.match('j', 'jason oscar aaa')  # match(正则表达式,待匹配的文本)
print(res2)  # None  从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
print(res2.group())  # j  没有则无法调用group() 直接报错(因为上面打印的是一串类似地址的东西,看不懂,需要group)

 
res3 = re.finditer('a', 'jason oscar aaa') # finditer(正则表达式,待匹配的文本) 
print(res3) # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3]) # ['a', 'a', 'a', 'a', 'a'] (元组迭代器转化为迭代对象 i for i in 变量名)


obj = re.compile('\d+') # 提前写好后续需要经常使用的正则
print(re.findall(obj,'asjd21hj13123j')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'234328748hgjghj')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'jhjhjh423432423')) # 写一遍之后 直接反复调用即可

 

标签:匹配,19,re,正则,print,李二,李杰
From: https://www.cnblogs.com/Milk1/p/17591258.html

相关文章

  • Java面试题 P17:Redis篇:Redis使用场景-缓存-缓存穿透
    什么是缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮。  互斥锁代码:1privatefinalReadWriteLockreadWriteLock=newReentrantReadWriteLock();2privatefinalLock......
  • 二十三、正则表达式和快捷键绑定
    1.QLineEdit类的setValidator方法设置正则表达式限制内容输入事例:1ui->lineEdit_in_num->setValidator(newQRegExpValidator(QRegExp("[.0-9]+$")));2.正则表达式介绍2.1单个字符匹配,匹配字符串匹配符前边的一个字符个数2.1.1“.”:匹配任意一个字符2.1.2“?”:匹配一......
  • React重新渲染的触发机制及其优化策略
    React是一个用于构建用户界面的JavaScript库,它的核心特点之一是使用虚拟DOM(VirtualDOM)来实现高效的组件渲染。那组件重新渲染的机制是如何呢?基于这些机制,如果进行优化呢?虚拟DOM是一个用JavaScript对象表示的DOM树,它可以在内存中快速地创建和修改,而不需要直接操作真实的DOM。React......
  • 每日总结(补档7月19日)
    今天的大部分时间都从火车上度过,比起大巴车,我还是更喜欢火车一点,最起码还能走走,在大巴上呆的骨头都要生锈了。在火车上将大道至简的第六章读完,深刻体会到了合作在生活和编程中的作用,一个人总不能独立完成一个超级庞大的程序,必须要更多的人分工协作才能达到最高的效率......
  • [GUET-CTF2019]number_game
    [GUET-CTF2019]number_game  打开题目,立刻定位关键函数for(i=0;i<=4;++i){for(j=0;j<=4;++j){for(k=j+1;k<=4;++k){if(*(&unk_601060+5*i+j)==*(&unk_601060+5*i+k))......
  • OpenResty 入门实战(2)--简单使用
    本文主要介绍 OpenResty 结合lua的使用,Nginx功能的一般使用可参考:Nginx入门实战(2)--简单使用;文中所使用到的软件版本:Centos7.9.2009、OpenResty1.21.4.2。1、helloworldserver{listen9096;server_namelocalhost-9096;access_loglogs/access-9096.log;......
  • Appuploader工具让ipa上传到App Store 的最新流程和步骤
    ​ 苹果官方提供的工具xcode上架ipa非常复杂麻烦。用appuploader可以在mac和windows上制作管理证书,无需钥匙串工具条件:1.以Windows为例,创建app打包ios需要的证书和描述文件      2.准备好一个苹果开发者账号(如果没有到苹果官网注册一个即可)目录  总体流......
  • 使用Appuploader工具将IPA上传到App Store的最新流程和步骤
    ​ 苹果官方提供的工具xcode上架ipa非常复杂麻烦。用appuploader可以在mac和windows上制作管理证书,无需钥匙串工具条件:1.以Windows为例,创建app打包ios需要的证书和描述文件      2.准备好一个苹果开发者账号(如果没有到苹果官网注册一个即可)目录  总体流......
  • Vue3中使用TypeScript封装axios遇到的问题(AxiosRequestConfig)
    如果您有更好的解决方法,欢迎评论区评论。版本"dependencies":{"axios":"^1.0.0","vant":"^4.6.3","vue":"^3.3.4","vue-router":"^4.2.4","vuex":&quo......
  • grep
    1.获取文件中的关键字key:catfileName|grep"key"2.获取文件中的某个关键字key1,key2,key3:catfileName|grep-E"key1|key2|key3"3.获取文件中的多个关键字,同时满足:catfileName|grepkey1|grepkey2|grepkey34.忽略文件中的某个关键字,需要转义......