欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python笔记(十):正则表达式

程序员文章站 2022-09-26 20:48:36
正则表达式对比工具 https://pan.baidu.com/s/1XIPyF1vFSj5PACPx9zW8_g (一) 正则表达式符号和特殊字符 符号 说明 示例 | 或 re1|re2,匹配re1或re2 . 匹配任何字符(\n除外) ^ 匹配字符串开始部分 ^ab.* 以ab开始的字符串,匹 ......

正则表达式对比工具

https://pan.baidu.com/s/1XIPyF1vFSj5PACPx9zW8_g

(一)      正则表达式符号和特殊字符

符号

说明

示例

|

re1|re2,匹配re1或re2

 .

匹配任何字符(\n除外)

 

^

匹配字符串开始部分

^ab.*

ab开始的字符串,匹配ab123ababc等等

$

匹配字符串结束部分

.*123$

以123结束的字符串,匹配ab123、测试123等等

*

匹配0次或多次前面的正则表达式

.*

匹配0次或多次前面的 .

+

匹配1次或多次前面的正则表达式

 

?

匹配0次或1次前面的正则表达式

 

{n}

匹配n次前面的正则表达式

.{5}

 

{m,n}

匹配M到N次前面的正则表达式

.{1,10}

 

[…]

匹配[]里的任一字符

[abc]d

匹配 adbdcd

[x-y]

匹配范围内的任一字符

[a-c]d:匹配 adbdcd

[0-9]d:匹配0d1d2d3d

[^…]

不匹配[]里的任一字符

[^a-c]d: 匹配 adbdcd

 

将正则表达式封闭为一个组

例如:[a-b][a-b] :只匹配aaab

([a-b][a-b])+:匹配aaaaabab

 

符号

说明

示例

\d

匹配任一数字,和[0-9]是一样的,\D则不匹配任何数字

A\d: 匹配A1A2

\w

 

匹配任一数字、字母,和[A-Za-z0-9]是一样的,\W则相反

 

 

\s

 

匹配任一空格字符,\S

则相反

hello\sword匹配hello word

\..

\后一个字符按字面意义匹配,不匹配特殊含义

\?:匹配?

\\d匹配\d

\b

 

匹配任何单词边界(\B

则相反)

例如:字符串 ab the Htherr

the: 能匹配到2 the

\bthe\b:只匹配第一个 the

\Bthe\B:只匹配第二个 the

\A

 

匹配字符串开始部分,\Z 字符串结束部分

参照^ $

 

(二)      贪婪模式和非贪婪模式

贪婪模式:尽可能的匹配

非贪婪模式:匹配到第一个结果后就结束匹配。在*、+、?、{}后面加一个?就是非贪婪模式。(*|+|?|{})?

看下面2张图就清楚了(蓝色背景表示匹配的内容)

第一张图(贪婪模式):匹配到第一/div>后还会继续向右匹配。(在内容和正则表达式匹配的情况下,尽可能的匹配最长字符串)

第二张图(非贪婪模式):匹配到第一个/div>后就结束匹配了。(在内容和正则表达式匹配的情况下,匹配到第一个结果后就结束匹配)

 Python笔记(十):正则表达式

Python笔记(十):正则表达式

 

 

(三)      re模块

函数/方法

说明

re.compile(pattern, flags=0)

(预编译)将正则表达式编译为对象(不是必须的,不过一般是会预编译)

实际应用中:下面2种方式都是可以用的

the_str=''

第一:
href_regx= re.compile('<div.*</div>')
href_regx.match(the_str)

第二:
re.match('<div.*</div>',the_str)

第一种是调用正则表达式对象的match()方法。

第二种写法是调用re模块的match()函数

match(pattern, string)

Pattern:正则表达式

String:字符串

匹配成功,返回字符串,失败则返回None。

预编译后的正则表达式对象则只需要传str就行了(因为它本身就是pattern对象

search(pattern, string)

Pattern:正则表达式

String:字符串

返回第一个匹配内容,没有匹配则返回None

findall(pattern, string)

 

以列表形式返回所有匹配的内容

finditer(pattern, string)

返回所有匹配的内容,以迭代器的形式

split(pattern, string)

Pattern匹配的内容作为分隔符,split将字符串分割为列表并返回

 

flags参数

说明

re.I  
re.IGNORECASE

 

不区分大小写

re.M

re.MULTILINE

匹配行的开始和结束部分,而不是严格匹配字符串本身的开始、结束部分

re.S

re.DOTALL)

 

. (点号)可以匹配\n

 

 

使用flags参数的时候,不清楚传第几个参数的话,最好先去看下方法(函数)的实现代码。

Python笔记(十):正则表达式

 

(四)      re模块示例

 1 import re
 2 the_str='<div id="hd_info"></div></div></div>'
 3 href_regx= re.compile('<div.*</div>')
 4 print('match()示例:',href_regx.match(the_str))
 5 print('match()示例:',re.match('<div.*</div>',the_str))
 6 print('search()示例:',re.search('/div>',the_str))
 7 
 8 print('findall()示例:',re.findall('/div>',the_str))
 9 print('finditer()示例:',re.finditer('/div>',the_str))
10 for i in re.finditer('/div>',the_str):
11     print('迭代finditer()返回值:',i)
12 
13 print('split()示例:',re.split('/.',the_str,re.DOTALL))

Python笔记(十):正则表达式

 

(五)      正则表达式实际应用

 匹配电信手机号

133、149、153、173、177、180、181、189、199开头的11位数字

正则表达式:1(39|49|53|[7][37]|[8][019]|99)[0-9]{8}

Python笔记(十):正则表达式

 匹配a标签开始 href属性值 (<a href='' ) 

Python笔记(十):正则表达式