来源:自学PHP网 时间:2019-08-18 23:45 作者:小飞侠 阅读:次
[导读] 深入浅析正则表达式re模块(部分)...
正则表达式: 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 什么是正则表达式: 一套规则 - 匹配字符串的 谈到正则,就只和字符串相关了。我们要考虑的是在同一个位置上可以出现的字符的范围。 正则表达式能做什么: •1.检测一个输入的字符串是否合法 -- web开发项目 表单验证 ◦用户输入一个内容的时候,我们要提前做检测 •2.从一个大文件中找到所有符合规则的内容 -- 日志分析\爬虫 ◦能够高效的从一大段文字中快速找到符合规则的内容 字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示。一个中括号只表示一个字符位置 元字符: 字符: 元字符 匹配内容的规则 量词: 量词 用法说明 #判断用户输入的内容是否合法,如果用户输入的对就能查到结果,如果输入的不对就不能查到结果 转义符: 原本有特殊意义的字符,到了表达它本身的意义的时候,需要转义。 . 有特殊的意义,取消特殊的意义\. 有一些有特殊意义的内容,放在字符组中,会取消它的特殊意义 贪婪匹配: 1.贪婪匹配:在量词范围允许的情况下,尽量多的匹配内容 .*x 表示匹配任意字符 任意多次数 遇到最后一个x才停下来 回溯算法: 2.非贪婪(惰性)匹配: 总是在量词范围内尽量少的匹配内容。前面的*,+等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配 .*?x 表示匹配任意字符 任意多次数 但是一旦遇到x就停下来 .+?x 匹配任意内容至少1次 遇到x就停止 元字符+量词+? ---> 惰性匹配 几个常用的非贪婪匹配: *? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复 例:匹配身份证号码:18/15位的身份证号 # 15位:首位数字为1-9,总共15位 [1-9]\d{14} # 18位:首位数字为1-9,末位为0-9或者X,总共18位 [1-9]\d{16}[\dx] [1-9]\d{16}[0-9x] #1: [1-9]\d{16}[0-9x]|[1-9]\d{14} #从一个大文件中找到所有符合规则的内容。表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14} ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ #检测一个输入的字符串是否合法 #2:简化 [1-9]\d{14}(\d{2}[\dx])? #从一个大文件中找到所有符合规则的内容 ^[1-9]\d{14}(\d{2}[\dx])?$ #检测一个输入的字符串是否合法 。()表示分组,将\d{2}[\dx]分成一组,就可以整体约束他们出现的次数为0-1次 例: 规则:1\d*?3 待匹配内容:1243333344 匹配结果:1243 规则:1\d*3 待匹配内容:1243333344 匹配结果:12433333 re模块: # findall 还是按照完整的正则进行匹配,只是显示括号里匹配到的内容。 取所有符合条件的,优先显示分组中的。 ret = re.findall('9\d\d','19740ash93010uru') print(ret)#['974', '930'] ret = re.findall('9(\d)\d','19740ash93010uru') print(ret)#['7', '3'] # search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数,来获取具体分组,即()中的内容。 search 只取第一个符合条件的,没有优先显示这件事儿 得到的结果是一个变量 变量.group() 的结果 完全和 变量.group(0)的结果一致 变量.group(n) 的形式来指定获取第n个分组中匹配到的内容 ret = re.search('9(\d)(\d)','19740ash93010uru') print(ret) # 变量 <_sre.SRE_Match object; span=(1, 4), match='974'> if ret: print(ret.group())#974 #ret.group(0) 0 默认不写 print(ret.group(1))#7 print(ret.group(2))#4 # 为什么在search中不需要分组优先 而在findall中需要? 加上括号是为了对真正需要的内容进行提取。 为什么要用分组? 把想要的内容放分组里 如果我们要查找的内容在一个复杂的环境中,我们要查的内容并没有一个突出的 与众不同的特点 甚至会和不需要的杂乱的数据混合在一起,这个时候我们就需要把所有的数据都统计出来,然后对这个数据进行筛选,把我们真正需要的数据对应的正则表达式用()圈起来,这样我们就可以筛选出真正需要的数据了。 # 如何取消分组优先 如果在写正则的时候由于不得已的原因,导致不要的内容也得写在分组里,通过 ?: 取消这个分组的优先显示 # (?:) 取消这个分组的优先显示 #findall ret = re.findall('<\w+>(\w+)\w+>',' 总结 以上所述是小编给大家介绍的深入浅析正则表达式re模块(部分),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对自学php网网站的支持! |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com