正则表达式实际操作

导入模块

首先导入re模块

import re

search方法

作用

search方法用于在字符串中搜索正则表达式模式第一次出现的位置。

re.search(r'dog','l like dog')

执行结果:
在这里插入图片描述

注意点

  1. search方法第一个参数,也就是描述的搜索规则,需要使用原始字符串然后前面加个r进行编写,这样可以避免很多不必要的麻烦
  2. 起始位置是从0开始的,找到就返回,找不到就返回null

用find方法实现如下:

'l like dog'.find('dog')

执行结果:
在这里插入图片描述
但是find方法具有局限性,不能使用通配符(正则表达式中的通配符是 . ,能匹配换行符之外的任何字符

如下:

re.search(r'.','l like dog')

执行结果:
在这里插入图片描述

re.search(r'fish.','l like fishc')

执行结果:
在这里插入图片描述

通配符(元字符)失效

那么如果我们想匹配.号呢?也就是让通配符失效,那该如何进行呢?如下:

re.search(r'\.','l like dog.')

执行结果:
在这里插入图片描述
加个反斜杠( \ )即可做到
反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能

匹配任何数字

re.search(r'\d','a b c 1 2 3')

执行结果:
在这里插入图片描述

 re.search(r'\d\d\d','avxsdf45679')

执行结果:
在这里插入图片描述

匹配一个IP地址(初学版)

re.search(r'\d\d\d.\d\d\d.\d\d\d.\d\d\d','192.168.111.123')

执行结果:
在这里插入图片描述
存在两个问题:

  1. 我们这里写法也就硬性规定每组IP必须三个数字,但是IP每组不一定是三个数字呀。。。假如是192.168.1.1该怎么匹配呢?(慢慢改吗?)
  2. 然后IP地址的每组范围是0 ~ 255,我们的这种写法的话,它的范围就变成了0 ~ 999

字符类

元字符[ 和元字符] ,即中括号是两个元字符,用它们来创建一个字符类,字符类的含义也就是只需要匹配到字符类中的任何一个字符,都算匹配成功。

完整元字符

.   ^   $   *   +   ?   {
    
     }   [ ]   \   |   ( )

例子1:匹配元音字符:

re.search(r'[aeiou]','l like dog')

执行结果:
在这里插入图片描述

注意:

正则表达式默认开启大小写敏感模式,即大写的i和小写的i是有区别的

re.search(r'[aeiouAEIOU]','I like dog')

执行结果:
在这里插入图片描述

表示范围(-)

注意,第一个是大写的i,不是小写的L

re.search(r'[a-z]','I like dog')

执行结果:
在这里插入图片描述

re.search(r'[0-9]','I like 123456 dog')

执行结果:
在这里插入图片描述

re.search(r'[3-9]','I like 123456 dog')

执行结果:
在这里插入图片描述

限定重复匹配次数({})

固定次数

re.search(r'bda{3}6','46asd5abdaaa68897')

执行结果:

在这里插入图片描述

范围次数

re.search(r'bda{1,6}6','46asd5abdaaaaa68897')

执行结果:
在这里插入图片描述

re.search(r'abcde{1,6}asdasd6','123458abcdeeasdasd6465465')

执行结果:
在这里插入图片描述

re.search(r'a{1,6}','aaaaaa')

执行结果:
在这里插入图片描述

re.search(r'a{1,6}','aaaaaaa')

执行结果:
在这里插入图片描述

re.search(r'a{2,6}','aa')

执行结果:
在这里插入图片描述

re.search(r'a{2,6}','a')

返回为null

跃跃欲试

用正则表达式匹配188如何操作?

第一种想法

re.search(r'[0-255]','188')

执行结果:
在这里插入图片描述

第二种想法

re.search(r'[0-2][0-5][0-5]','188')

执行结果返回为null

注意:正则表达式匹配的是字符串,数字对于字符来说只有0 ~ 9,

  1. r'[0-255]'这个表示什么意思呢?也就是0 - 2然后两个5 5,重复字符,即匹配四个字符 0 1 2 5
  2. [0-2][0-5][0-5]这代表哪些呢?第一个是0 - 2 (字符0 1 2),第二个是 0 - 5(0 1 2 3 4 5),第三个是 0 - 5(0 1 2 3 4 5),以这些字符组合起来的都能被匹配到,(188后面8 和8字符第二个和第三个里面并没有,所以返回值为null)如下图所示
re.search(r'[0-2][0-5][0-5]','133')

执行结果:
在这里插入图片描述

re.search(r'[0-2][0-5][0-5]','011')

执行结果:
在这里插入图片描述

re.search(r'[0-2][0-5][0-5]','254')

执行结果:
在这里插入图片描述

正确搞法

re.search(r'[0-1]\d\d|2[0-4]\d|25[0-5]','188')

执行结果:
在这里插入图片描述

解释:

[0-1]\d\d|2[0-4]\d|25[0-5]解释一下:[0-1]代表这个字符可以是0或者是1,\d表示0-9,\d表示0-9,| 表示或,即有一个成立则全部成立;2[0-4]\d2表示字符2,[0-4]表示0 ~ 4, \d表示0 - 9;25[0-5]2表示字符2,5表示字符5,[0-5]表示0 ~ 5字符。我个人觉得应该和下面代码的字符匹配作用一样的吧

re.search(r'[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]','188')

在这里插入图片描述

匹配一个IP地址(进阶版)

版本1

re.search(r'(([01]\d\d|2[0-4]\d|25[0-5])\.){3}([01]\d\d|2[0-4]\d|25[0-5])','192.168.111.121')

在这里插入图片描述
然后我们利用{}再控制一下各自的重复次数

版本2

re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','192.168.1.1')

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSNN2019/article/details/114456939