python入门_常见正则表达式匹配

python入门_常见正则表达式匹配_第1张图片
made_in_miliLV的主页.png

- 正则表达式:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。在开发的使用场景 - 例如:匹配url等等

本文中,对正则表达式的一些语法使用,进行了探究与测试,其中包括以下几部分:
①.正则表达式模块组成
②.正则表达式的语法 - '.' , '[...]' , '\d \D' , '\s \S', ' \w \W'
③.正则表达式的语法 - ' * ', ' + ', ' ? ', ' {m} {m,n}', ' *? +? ?? '
④.正则表达式的语法 - '^', ' $' ,' \A \Z'
⑤.正则表达式的语法 - '|' , ' (ab) ',

  • 特别说明,图片名称 与上图的目录对应: 四[n] = 语法四 = 第⑤条!
python入门_常见正则表达式匹配_第2张图片
1.png
a.使用re的compilie - 生成 pattern对象
b.调用pattern的方法 - 匹配字符串 -- 方法举例:match
    --match:从字符串开头开始匹配,匹配的内容是 compile(‘str’)中的 str
c.返回一个匹配结果 - result
python入门_常见正则表达式匹配_第3张图片
2.png
3.png
  • 使用find方法
    • 找到,就返回起始索引起始下标
    • 找不到,就返回 -1
python入门_常见正则表达式匹配_第4张图片
4.png
  • 使用 startswitch - 判断起始字符串 匹配

使用正则匹配
python入门_常见正则表达式匹配_第5张图片
5.png

a.查看pattern内容

6.png

b.查看pattern类型 - pattern实例


python入门_常见正则表达式匹配_第6张图片
7.png

c.查看pattern的所有方法

8.png

d. 查看match的用法:

python入门_常见正则表达式匹配_第7张图片
9.png
  • match用法 - 从起始位置开始匹配
    匹配成功的话 - 返回对象
    匹配不到的话 - 返回zero
10.png
  • 使用match - 开始匹配
11.png
python入门_常见正则表达式匹配_第8张图片
_12.png

==> 匹配成功,返回对象

python入门_常见正则表达式匹配_第9张图片
13.png

==>匹配失败 - 返回zero


匹配数据查看

  • 查看匹配的内容 - group()


    15.png
16.png
group() - 使用说明 - 返回字符串or 元组
      ==>匹配的内容是'()' - 返回元组
      ==>匹配的内容是str - 返回字符串
  • 查看 匹配内容在源字符串中的 - 位置


    17.png

a.查看匹配规则 - miliLV

18.png

b.查看源字符串

19.png
20.png

c. miliLV 在 'miliLV study python' 字符串中的 [0,6)位置,没毛病

  • 查看源字符串 - string
21.png
  • 匹配大小写 - 大写的ignorecase
python入门_常见正则表达式匹配_第10张图片
22.png

匹配规则 - ‘python’ + re.I => 可以匹配大写的'python'

23.png

进行匹配的数据源 - 'PYThon'

24.png

查看匹配结果

25.png

匹配的规则 - 'python' ,re.I
匹配数据源大写的PYT 拼小写的 hon! == 'PYThon'

这个匹配规则,只要是 'python'这个str,无论里面的字符大小写,都可以顺利匹配!


  • 直接使用match的方式 - 不多设置一个pattern接收


    26.png
python入门_常见正则表达式匹配_第11张图片
27.png

正则表达式语法说明一: '.' , '[...]' , '\d \D' , '\s \S', ' \w \W' 用法

python入门_常见正则表达式匹配_第12张图片
一(1).png
  • 使用“.” 匹配 --> 除了\n以外的所有字符

①.'a' 匹配 'a'


python入门_常见正则表达式匹配_第13张图片
一(2).png

②.'a'的规则 - 匹配内容:‘b’


python入门_常见正则表达式匹配_第14张图片
一(3).png

③.使用万能匹配 - '.'


python入门_常见正则表达式匹配_第15张图片
一(4).png

④.查看'.'的匹配规则:

一(5).png

  • 匹配 - 字典{xxx}
  1. { } 中 - 内容是字符


    python入门_常见正则表达式匹配_第16张图片
    一(6).png
  2. { } 中 - 内容是数字


    python入门_常见正则表达式匹配_第17张图片
    一(7).png
  3. { }中 - 内容有多个字符


    python入门_常见正则表达式匹配_第18张图片
    一(8).png

总结: 一个“.” 只能对应一个字符!

疑问 - 多字符匹配如何匹配??

python入门_常见正则表达式匹配_第19张图片
一(9).png
一(10).png
python入门_常见正则表达式匹配_第20张图片
一(11).png

总结:
几个字符 - 就用几个"." 去对应匹配

一个点不是匹配一个字符串!而是一个字符!
所以上图的{.} - 匹配不了两个字符{ 1C }的内容!- zero!


  • 字符集匹配 - [ ... ]
一(12).png
  1. 匹配 - ['abc'] 字符集‘abc’中的某个字符是否存在
python入门_常见正则表达式匹配_第21张图片
一(13).png
  1. 匹配非字符集中的字符 - 比如'd'
python入门_常见正则表达式匹配_第22张图片
一(14).png
  1. 为了让d 包含在字符集中匹配 - 修改匹配规则
python入门_常见正则表达式匹配_第23张图片
一(15).png
虽然可以一个一个写,但是如果匹配的规则是所有英文字母,不得写a,b,c,d, ... z?

解决办法 : 区间匹配 - 使用简写

python入门_常见正则表达式匹配_第24张图片
一(16).png

大写字母 - 大A呢?

python入门_常见正则表达式匹配_第25张图片
一(17).png
  • 解决办法:必须要再添加A-Z的匹配规则,a-z 是无法匹配大写字母 “A”的
python入门_常见正则表达式匹配_第26张图片
一(18).png
python入门_常见正则表达式匹配_第27张图片
一(19).png

区间匹配,匹配规则如下

  • 可以连着写 : a-zA-Z
  • 也可以用“,”隔开 : a-z,A-Z

==> 怀疑:[a,b]规则 - 匹配 ‘1,2’

python入门_常见正则表达式匹配_第28张图片
一(20).png
python入门_常见正则表达式匹配_第29张图片
一(21).png
  • 不管a & z 的顺序,写在第一个的,就会被匹配

测试 -匹配双字符呢?

python入门_常见正则表达式匹配_第30张图片
一(22).png

python入门_常见正则表达式匹配_第31张图片
一(23).png

总结: 一个‘[ ]’ 就是匹配一个字符,多余的字符会被忽略!


  • 匹配单词字符 \w
    一(24).png
  1. 正常匹配字符 --> \w
python入门_常见正则表达式匹配_第32张图片
一(25).png
python入门_常见正则表达式匹配_第33张图片
一(26).png

2.使用单词匹配 :\w -匹配非正常字符 - 例如此处的“ ” - 空格


python入门_常见正则表达式匹配_第34张图片
一(27).png

3.使用非单词匹配 : \W - 匹配非正常字符 - 空格


python入门_常见正则表达式匹配_第35张图片
一(28).png
  • 匹配内容为 - [xxx]的情况下

1.匹配规则'[xxx] '


python入门_常见正则表达式匹配_第36张图片
一(29).png

2.匹配规则 - '[[xxx]]'


python入门_常见正则表达式匹配_第37张图片
一(30).png

3.解决办法 - 加转译字符!


python入门_常见正则表达式匹配_第38张图片
一(31).png

正则语法二 * __ + __ ? __ {m}/{m,n} __ *?/+?/??

python入门_常见正则表达式匹配_第39张图片
二(1).png
  • 正则匹配 - *
  1. 匹配 - 双字符的情况下


    python入门_常见正则表达式匹配_第40张图片
    二(2).png
  2. 匹配 - 单字符的情况下


    python入门_常见正则表达式匹配_第41张图片
    二(3).png
  • * 排上用场的时候!
二(4).png
python入门_常见正则表达式匹配_第42张图片
二(5).png

* 可以匹配 0 次 或者多次,例如上图的[a-z]* 匹配0次,也成功匹配!

  • test:*匹配无限次!

1.常规匹配 - 未使用 *


python入门_常见正则表达式匹配_第43张图片
二(6).png

2.优化匹配 - 带 *


python入门_常见正则表达式匹配_第44张图片
二(7).png
  • test:数字开头的匹配
  1. 数字开头


    python入门_常见正则表达式匹配_第45张图片
    二(8).png
  2. 数字结尾


    python入门_常见正则表达式匹配_第46张图片
    二(9).png

总结:

  • * 代表可以出现0次 or 无限次
  • *的结尾标志 - 出现在 不满足匹配规则的第一个字符开始,全部舍弃

  • 正则匹配 - “+” 号
二(10).png
  • 例如:项目需求 - 测试变量名是否正确

①.大小写字母开头


python入门_常见正则表达式匹配_第47张图片
二(11).png

②.下划线开头


python入门_常见正则表达式匹配_第48张图片
二(12).png
python入门_常见正则表达式匹配_第49张图片
二(13).png
python入门_常见正则表达式匹配_第50张图片
二(14).png

③.数字开头


python入门_常见正则表达式匹配_第51张图片
二(15).png

变量名 -- 只能以 下划线_ or 大小写字母开头!


  • 正则 - 开头 ==> 大小写字母 or _ 至少一次,可以多次 ==> '+' 派上场了!

①.匹配单字符


python入门_常见正则表达式匹配_第52张图片
二(16).png

②.匹配单下划线


python入门_常见正则表达式匹配_第53张图片
二(17).png

③.匹配 - 多字符


python入门_常见正则表达式匹配_第54张图片
二(18).png

==> 只匹配了一个字符!! 所以需要'+'登场了!

④.匹配 - 多字符 && 使用 '+'

python入门_常见正则表达式匹配_第55张图片
二(19).png

⑤. 匹配 - 带数字的!比如button1


二(20).png

⑥.优化- 加号+ && * 结合使用!


二(21).png

思路:

  • 英文字母 or _ 开头是必须的,所以用 加号 - 表明只是匹配一次
  • 除了首字符,其他的可以用数字,英文字母等,但是不一定要有!所以可以0次,用*

test:
①.前部分用+,匹配后部分(数字or英文字母,但是不设置 * 的次数)

二(22).png

前部分[_,a-z,A-Z] 使用了‘+’,表示可以1-N次,当第一个不满足匹配规则的 - 数字1出现之后,停止前部分匹配 - 使用后部分 带[0-9]的匹配规则

②.后部分的匹配内容 - 数字长度改为不等于1之后:


二(23).png

③.优化:使用'*' - 表示后部分的规则 - 可以不出现 or 出现多次

二(24).png

  • 正则匹配 - “?” 号
    二(25).png

例如 - 验证:一个数字 - 是否是0-99直接的数字

分析 ->

  • 最少一位,至多2位,个位数上的是必须的,所以直接用[0-9]
  • 十位数上,可能有,也可能没有,如果0-9,就没有十位数,所以十位数上匹配规则 --> '[1-9]?'
  • 加个问号 - 代表十位数可以有一次,也可以没有!

test:

  1. 常规数字:


    python入门_常见正则表达式匹配_第56张图片
    二(26).png
  2. 个位数为 0


    二(27).png
  3. 小于10的个位数数字


    二(28).png
  4. 特例:创世神- 09(以0开头的 - 个位数!)- dotaer才懂的这个梗

    python入门_常见正则表达式匹配_第57张图片
    二(29).png

解释原因:

  • 查看十位数的匹配规则 - [1-9]? -- 此时十位数是0,所以不满足[1-9]的匹配条件,并且十位数是 ? - 可以为 0次! --> 所以首数字 -0 直接进入后半部分匹配!
  • 个位数匹配规则 - [0-9],并且只能匹一次,此时进来匹配的是 '09' ==> ‘0’满足 匹配条件 -[0-9]! ==> 所以最终输出0,因为个位数的匹配是 - [0-9],并没有+ or * ,所以只匹配一个字符 --> ‘0’,剩下的'9'就被舍弃了

  • 正则语法之 - 匹配字符出现次数 - {a}/{a,b}
二(30).png

①.匹配5次 - { 5 }


python入门_常见正则表达式匹配_第58张图片
二(31).png

②.不满足条件的 { 5 }


python入门_常见正则表达式匹配_第59张图片
二(32).png

解释:虽然参与匹配的str 是 ‘1234A’有五个字符,But并不是所有字符都满足匹配规则! 最终只有1234满足,所有匹配的次数 - 4次 != 5次,不满足! -> 返回zero!

③.设置区间匹配 {4,6}


python入门_常见正则表达式匹配_第60张图片
二(33).png

④. 测试 - 越界


python入门_常见正则表达式匹配_第61张图片
二(34).png

⑤.测试 - 部分不满足匹配规则的 - str


python入门_常见正则表达式匹配_第62张图片
二(35).png

⑥.测试 - gamil邮箱 - 假定6位字符 + @ gmail.com

python入门_常见正则表达式匹配_第63张图片
二(36).png

⑦.测试 - 越界


二(37).png

⑧.优化 - 改善匹配规则的次数


二(38).png

  • 贪婪模式与非贪婪模式 - ?
二(39).png
  1. 贪婪匹配 - *
python入门_常见正则表达式匹配_第64张图片
二(40).png

贪婪模式- abc均在 [a-z]* 的匹配规则下,所以全匹配了 - 尽可能多的匹配

  1. 非贪婪模式 - *?


    二(41).png
  • * 的匹配次数是 - [0,n],贪婪模式取最多 -n,非贪婪模式 取最少 ==>0
  • 所以后部分[a-z]直接匹配0次,最终只匹配前部分 - [0,9]
  • 而且[0-9] 没加 * or + 修饰,所以只匹配一次
  1. 同理,贪婪模式下的 ==> '+' 匹配


    python入门_常见正则表达式匹配_第65张图片
    二(42).png
  2. 非贪婪的 '+' 匹配 ==> 取最低 - 一次匹配!


    二(43).png
  3. 贪婪模式下的 '?' ==>( ? 表示:匹配 0 or 1 次!)

    二(44).png

6.非贪婪模式下 '?' ==> ([0,1] - 取最少 = 0次!)

二(45).png


正则语法三 ^ __ $ __ \A __ \Z __

python入门_常见正则表达式匹配_第66张图片
三(1).png

总结: 字符串开头 - ^
字符串结尾 - $

①.邮箱匹配


python入门_常见正则表达式匹配_第67张图片
三(2).png

②.如果-结尾在.com之后,又加了一堆东西


python入门_常见正则表达式匹配_第68张图片
三(3).png

所以:为了正确匹配邮箱,应该设置以.com结尾为匹配条件! -> 使用$结尾符

python入门_常见正则表达式匹配_第69张图片
三(4).png

③.正确匹配结果如下:


三(5).png

④.完整写法 - 再加上开头^


三(6).png

三(7).png

test:
1.\A 写在匹配规则前

python入门_常见正则表达式匹配_第70张图片
三(8).png

  1. 跟*/ + ? 一样,写在后面?


    python入门_常见正则表达式匹配_第71张图片
    三(9).png

3.正确写法:


三(10).png

\A写在前面没错,第一次error,内容里有','
匹配规则 - \w - 只能匹配字符!数字 && 大小写字母 && 下划线_ !

三(11).png
三(12).png

正则语法四 | && (ab)

python入门_常见正则表达式匹配_第72张图片
四(1).png

-| '或' 的用法

①.'abc' | '123' ==> 可以匹配 'abc' or '123'!

python入门_常见正则表达式匹配_第73张图片
四(2).png
python入门_常见正则表达式匹配_第74张图片
四(3).png
  • 'abc|123' 去 匹配 'abc|123'
四(4).png

猜测结果:

  • 匹配成功:匹配的内容group = 'abc|123'
  • 匹配失败:只能匹配‘abc’ or ‘123’

②.结果如下:


python入门_常见正则表达式匹配_第75张图片
四(5).png

原理解释:

  • 拿'abc|123' 去 匹配规则 -- 'abc|123' 中匹配,发现 匹配规则 - | 前部分的 abc 正好与 我们的源字符串'abc|123'的'abc'匹配 - 满足匹配规则 - success ==> group = 'abc'!

test2:

四(6).png

猜测 - 匹配不上:

  • 匹配规则 - 'abc|123'
  • 数据源 ---- '123|abc'
  • 均不对应,匹配不上!

③.结果如下:

python入门_常见正则表达式匹配_第76张图片
四(7).png

原理解释:

  • 数据源 -- '123|abc' 去 匹配规则'abc|123'中查找
  • 前部分 'abc'不符合 - 跳过
  • 后半部分 '123'符合匹配条件 -- 匹配成功! group = 123

  • 分组 - 使用'()'实现
四(8).png

①.需求 : 匹配gmail邮箱:

python入门_常见正则表达式匹配_第77张图片
四(9).png

②.需求 - 匹配 gmail && 163 邮箱 - 思路 : 使用 “|”(或)


python入门_常见正则表达式匹配_第78张图片
四(10).png

③.精简写法 - 不抄写整个的邮箱

python入门_常见正则表达式匹配_第79张图片
四(11).png

- 想要实现参数 ~ gmail || 163的替换,但是后半部分 - 直接被舍去匹配了

特别注意:这里的匹配,并不是 - ‘gmail' or '163.com'! -- 这整个后半部分

四(12).png
  • 解决办法 - 正确使用分组 - ()
python入门_常见正则表达式匹配_第80张图片
四(13).png
四(14).png
四(15).png

主要用在XML标签中,暂不学习


  • 学习就要不断的保持对未知知识的兴趣,不是别人说什么就是什么。要勇于提出质疑,sunnyxx大神说的 - 要勇于提出质疑,‘凭什么你说的就是对的?我也要试试’

  • 正则的规则其实是可以背的,但是如果不自己去探究一波,感觉很多东西就只是死记硬背,终究还是会忘记,只有自己掌握的,才是自己的~

你可能感兴趣的:(python入门_常见正则表达式匹配)