S7day19 模块1 + re模块(正则表达式)
模块
模块的定义:
一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字+.py
其实import加载的模块分为四个通用类别:
1.使用python编写的代码(.py文件)
2.已被编译为共享库或DLL的C或C++拓展
3.包好的一组模块的包
4.使用C编写并链接到python解释器的内置模块
模块的作用:
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。
一、初始re模块
正则表达式
正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则。
官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式在线测试工具 (非常好用)
例1:根据手机号码一共11位并且是只以13、14、15、18开头的数字这些特点
正则表达式的语法:
1.字符组 [ ]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[ ]表示。字符分为很多类,比如数字、字母、标点等等。
例1:匹配数字8
正则[123456789] True 由于字符组里有数字1,2,3,4,5,6,7,8,9,字符组里任何一个字符和待匹配字符相同都视为可以匹配
#也可以写成这样[1-9]
正则[abc] Flase 由于字符组里没有数字1,2,3,4,5,6,7,8,9 所以不能匹配
列2:匹配字母z
[a-z] true 由于a-z里有z,可以匹配 [A-Z] flase 由于是A-Z里没有z,不可以匹配
[a-zA-Z] true a-z,A-Z里有z,可以匹配
[a-Z] 报错 a的ASCII码大于Z的ASCII码
1.1字符
规则如下:

注意:\w 意思是:匹配字母或数字或下划线
\W 意思是:匹配非字母或数字或下划线
但是\w\W 代表的意思是匹配任意字符或数字或下划线 原因是两个元字符互斥
1.2量词
规则如下:

精确匹配:
1.{m}’ 精确匹配m次; ‘{m,n}’ 匹配最少m次,最多n次。(n>m)
2. 如果你只想指定一个最少次数或只指定一个最多次数,你可以把另外一个参数空起来。比如你想指定最少3次,可以写成 {3,} (注意那个逗号),同样如果只想指定最大为5次,可以写成{,5},也可以写成{0,5}。
例1:
1 22 333 4444 55555 666666
a:3位数
\b\d{3}\b
b: 2位数到4位数
\b\d{2,4}\b
c: 5位数以上的数
b\d{5,}\b
d: 4位数以下的数
\b\d{1,4}\b
. ^ $使用规则

* + ? { }的使用规则

. * ?的用法:
. 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式。 合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?x 就是取前面任意长度的字符,直到一个x出现
*与+都是贪婪匹配,匹配最多的
后面+?解除贪婪匹配,匹配最少—惰性匹配
*与+的区别:
| 正则 | 待匹配的字符 | 匹配结果 | 说明 |
| \d* | 456bdha345 |
456
|
*重复零次或多次 由于456后面是字母,每个字母匹配不到,都会留下空格 |
| \d+ |
456 345 |
+重复一次或多次 但是不会留下空格 |
贪婪模式
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

?的用法:
*? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 (最小匹配) {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复
分组 ( ) 或 | [^]使用规则
例1:
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部🈶️数字组成,首位不能为0;如果是18位,
则前17位全部是数字,末位可能是数字或x,下面我们尝试用正则来表示:

转译符\ 使用规则
在正则表达式中,有很多有特殊意义的是元字符,比如\d和\s等,如果要在正则中匹配正常的"\d"而不是"数字"就需要对"\"进行转义,变成'\\'。在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\d",字符串中要写成'\\d',那么正则里就要写成"\\\\d",这样就太麻烦了。这个时候我们就用到了r'\d'这个概念,此时的正则是r'\\d'就可以了。

二、re模块的用法:
1.findall
findall(pattern,string,flags=0) 在目标字符串查找符合规则的字符串
参数:
pattern—规则
string—目标字符串
flags—后面还可以跟一个规则选择项
返回值:
1.一个列表(如果有括号()分组,则只返回所有分组的列表)
2.如果没有符合规则的字符串匹配,就会返回一个空值None
示例:
import re mail='user01@mail.com user02@mail.com user@qq.com' ret=re.findall(r'(\w+@m....[a-z]{3})',mail) print(ret)
#['user01@mail.com', 'user02@mail.com']
2.search
search(pattern,string,flags=0 ) 函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个对象k
参数:
pattern—规则
string—表示要匹配的字符串
flags—标志位,用于控制正则表达式的匹配方式
返回值:
1.通过group( )取得返回值
2.如果字符串没有匹配,则返回空值None
示例:
import re mail='user01@mail.com user02@mail.com user@qq.com' ret=re.search(r'(\w+@m....[a-z]{3})',mail).group() print(ret)
#user01@mail.com #找到的第一个匹配的结果
3.match
match(pattern, string, flags=0) 尝试从字符串的开始匹配一个模式,也等于说是匹配第一个单词。
return a corresponding match object.
pattern—规则
string—表示要匹配的字符串
flags—标志位,用于控制正则表达式的匹配方式
返回值:
1.通过group( )取得返回值
2.如果字符串没有匹配,则返回空值None
示例:
match和search区别:
Python提供了两种不同的原始操作:match和search。match是从字符串的起点开始做匹配,而search(perl默认)是从字符串做任意匹配。
4.split
split(pattern, string, maxsplit=0) 用于来分割字符串
pattern—规则
string—表示要匹配的字符串
maxsplit—最大分割字符串,默认为0,表示每个匹配项都分割
返回值:
一个列表
示例:
ret = re.split('[ab]', 'abcd') print(ret)
#['','','cd']
首先,先分割‘a’得到‘’和‘bcd’,在进行b的分割,由于b的左边为空得到‘’,右边是‘cd’,最终获得['','','cd']
5.sub、subn
sub(pattern,repl,string,count=0)用于替换字符串中的匹配项
参数:
pattern—规则
repl—替换的字符串,也可为一个函数
string—要被查找替换的的原始字符串
count—模式匹配后替换的最大次数,默认0表示替换的所有匹配
返回值:
返回一个字符串,如果无匹配,字符串将会无改变地返回
(subn: 返回的是包含新字符串和替换执行次数的两元组 )
示例:
ret = re.sub('\d', 'H', 'eva3egon4yuan4') #默认替换所有 print(ret) ret = re.sub('\d', 'H', 'eva3egon4yuan4',1)#参数1表示只替换1个 print(ret)
6.compile
compile(pattern,flags=0) 编译
可以把正则表达式编译成一个正则对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率
参数:
pattern—规则
flags—标志位
返回值:
正则表达式的对象,然后可以通过正则表达式对象调用match()和search()方法,用group( )取得值
示例:
import re
s='sdfdfsdwsrer'
ret=re.compile(‘\w+?s’) # 被编译成 正则表达式的对象
r=ret.search(s) # 通过调用search来获得结果
print(r.group()) # 将结果打印出来

浙公网安备 33010602011771号