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

 


        345

*重复零次或多次

由于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())                           #         将结果打印出来

 

posted @ 2017-09-11 17:26  panda_R  阅读(125)  评论(0)    收藏  举报