三十一、深入Python中的正则表达式( 二 )
我们除了可以使用findall , 还可以使用search , 我们把元字符reg = "(\d{1,3}.){3}\d{1,3}" 。
这元字符中的\d{1,3}.指定是我们ip前三个数字 , 后面加{3}就是重复3次 。 \d{1,3}指的就是我们ip最后一个数字 。
但是search和findall是有区别的 , search只能匹配第一个 , 我们需要使用列表取出第一个 , 而findall匹配所有 。
文章插图
组匹配什么是组匹配 , 比如说这里边我有一个字符串s = this is phone:13888888888 and this is my postcode:012345 , 我需要你把手机号和验证码匹配出来 。
因为 , 我们要匹配两个 , 而已每个的元字符都是不一样的 。 所以 , 我们需要分组匹配 。
正则表达式的括号表示分组匹配 , 括号中的模式可以用来匹配分组的内容 。
于是我们的元字符就变成:reg = this is phone:(\d{11}) and this is my postcode:(\d{6})
我们一般使用search进行分组匹配 , 上次我是不是说过search需要使用列表取出来 , 这里的组匹配也是一样 , 不过这里用的是group()方法 。 group(1)代表了我们的手机号 , group(2)代表了我们的验证码 , 而group(0)代表了我们的手机号和验证码 , 代码如下图所示 。
文章插图
在正则表达式中 , 除了findall和search用法 , 还有一个match用法 。
match用法只匹配开头的 , 也是需要group()取出来 , 下图match的例子 。
文章插图
这是的re.I是忽略大小写的意思 。
贪婪与非贪婪贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为 , 贪婪模式在整个表达式匹配成功的前提下 , 尽可能多的匹配 , 而非贪婪模式在整个表达式匹配成功的前提下 , 尽可能少的匹配 。
贪婪和非贪婪有几个非常重要的操作符 。
操作符 含义 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次
比如说这里边我有一个字符串reg_string = pythonnnnnnnnnpythonHelloPytho , 我们先使用贪婪的模式下的元字符:reg = "python*"
文章插图
贪婪模式下的reg = "python*" , 意味着n重复零次或更多次 。 所以我们看到了第一关结果的pythonnnnnnnnn尽可能多的匹配 。
下面使用非贪婪的模式下的元字符:reg = "python*?",reg = "python+?",reg = "python??" 。
文章插图
非贪婪模式下的reg = "python*" , 意味着n零次或一次 , 所以我们没有看到pythonnnnnnnnn的结果 。
手机号码验证首先 , 我们要知道我们的手机号码是什么开头的?
移动手机号码开头有16个号段:134、135、136、137、138、139、147、150、151、152、157、158、159、182、187、188 。
联通手机号码开头有7种号段:130、131、132、155、156、185、186 。
电信手机号码开头有4个号段:133、153、180、189 。
文章插图
这样我们就可以在开头做事情了 , 先判断开头是不是上面的号段 , regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$" , 就是我们的元字符 , 代码如下:
import redef checkCellphone(cellphone):regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$"result = re.findall(regex,cellphone)if result:print("匹配成功")return Trueelse:print("匹配失败")return Falsecellphone = '13717378202'checkCellphone(cellphone)匹配成功True匹配邮箱合法性下面 , 我们进行一个作业 , 就是来匹配我们的邮箱号码 。
文章插图
作业的答案如下:
import redef checkEmail(email):regex_1 = '^(\w+)@sina.com$'regex_2 = '^(\w+)@sina.com.cn$'regex_3 = '^(\w+)@163.com$'regex_4 = '^(\w+)@126.com$'regex_5 = '^[1-9][0,9]{4,}+@qq.com$'regex = [regex_1 ,regex_2 ,regex_3, regex_4, regex_5]for i inregex:result = re.findall(i,email)if result:print("匹配成功")return Trueelse:print("匹配失败")return Falseemail = 'sdjflsdjkl@sina.com'checkEmail(email)正则表达式测试工具打开开源中国提供的正则表达式测试工具, 输入待匹配的文本 , 然后选择常用的正则表达式 , 就可以得出相应的匹配结果了 。
例如 , 输入下面这段待匹配的文本:
Hello, my phone number is 123455678 and email is runsen@qq.com, and my website is
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 占营收|华为值多少钱
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- 印度|拒绝华为后,印度、英国斥资数十亿求助日本
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 拍照|iPhone12还没捂热13就曝光了,屏幕、信号、拍照均有升级!
- 路由器|家里无线网经常断网、网速慢怎么办?教你几个小窍门,轻松解决
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型
