python自动化开发学习【第六天】

import  re   # 正则只能匹配字符串

通配符:

  • .      可以匹配任何字符(除了换行符),只能匹配一个字符
  • \      反斜杠,转义字符
  • ^     开头符号需要转义,匹配字符串的开始,也可以是否定运算符不许转义
  • $      匹配字符串的结束
  • \w    匹配字母或数字或下划线或汉字
  • \W   匹配非字母数字
  • \s     匹配任意的空白符 ,等价于[\t\n\r\f]
  • \S    匹配任意非空字符
  • \d    匹配数字
  • \D    匹配任意服数字
  • \A    匹配字符串开始
  • \Z    匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
  • \z     匹配字符串结束
  • \G    匹配最后匹配完成的位置
  • \b    匹配单词的开始或结束
  • |      选择项字符,或的意思
  • *     允许重复0次或者多次
  • +    允许重复1次或者多次
  • ?     出现一次或者根本不出现
  • { m , n }    重复m~n次
  • { m }        重复m次
  • { m , }      重复m次或更多次
  • ()        小括号是为了提取匹配的字符串,表达式中有几个小括号就有几个相应的匹配字符串
  • (\s*)   表示连续空格的字符串
  • []中括号表示定义匹配的字符范围,[a-zA-Z0-9]表示匹配字母和数字,[\s*]表示空格或者*号

(0-9) 匹配‘0-9’本身

[ 0-9 ]*  匹配数字(注意有*,可以为空)

[ 0-9 ]+ 匹配数字(注意有+,不可以为空)

{ 1-9 }  大括号中,错误的写法

[ 0- 9]{0,9} 表示长度为0到9的数字字符串

match  

match(pattern,string,flags=0)

# pattern: 正则模型

# string : 要匹配的字符串

# flags :   匹配模式

match方法会在给定的字符串的开头进行匹配,如果匹配不成功则返回None,匹配成功返回一个匹配对象,这个对象可以使用group方法,可以将匹配到的字符串给出。

>>> ret = re.match(r"abc","ab1c123")    # 从头开始匹配

>>> print(ret)                                          # 直接打印为None

None

>>> re.match(r"abc","abc123")

<_sre.SRE_Match object; span=(0, 3), match=‘abc‘>  #span指的是匹配到的字符在字符串中的位置下标,分别对应start和end,不包括end

>>> obj = re.match(r"abc","abc123")

>>> obj.group()                                      # 通过 group()方法返回匹配到的值

‘abc‘

>>> obj = re.match(r"abc","abc123")

>>> obj.start()

0

>>> obj.end()

3

>>> obj.span()

(0, 3)

>>> obj.group()

‘abc‘

search

search(pattern, string, flags=0)

search方法是在字符串内查找模式,返回第一个匹配都的字符串。如果匹配不成功则返回None,匹配成功返回一个匹配对象,这个对象可以使用group方法,可以将匹配到的字符串给出。

>>> obj = re.search(r"abc","123abc456abc789")

>>> obj

<_sre.SRE_Match object; span=(3, 6), match=‘abc‘>

>>> obj.group()       # 和match 一样同样有group()方法,返回匹配到的字符串

‘abc‘

>>> obj.start()

3

>>> obj.end()

6

>>> obj.span()

(3, 6)

findall

findall(pattern,string,flags=0)

findall和match,search的不同之处在于,前两者都是单值匹配,而它是全部匹配,它的返回值是一个匹配到字符串的列表

如果没有匹配到对象,那么就返回一个空列表,所有findall是没有group方法的,也没有start,end,span.

>>> obj = re.findall(r"abc","123abc456abc789")

>>> obj

[‘abc‘, ‘abc‘]           # 返回值是一个列表,列表中包含所匹配到的字符串

>>> obj.group()   # 不存在group方法

Traceback (most recent call last):

File "<pyshell#37>", line 1, in <module>

obj.group()

AttributeError: ‘list‘ object has no attribute ‘group‘

>>> obj = re.findall(r"ABC","123abc456abc789")

>>> print(obj)      # 如果没有匹配到字符串,则返回一个空列表

[]

split

split(pattern, string, maxsplit=0, flags=0)

# pattern : 正则模型

# string : 要匹配的字符串

# maxsplit : 指定分割个数

# flags : 匹配模式

split函数和字符串类型的split方法很相似,都是利用特定的字符去分隔字符串。但re模块的split可以使用正则表达式,因此更加灵活,

更加强大。

>>> s = "8+7*5+6/3"

>>> tmp = re.split(r"[\+\-\*\/]",s)         # 匹配模式是加减乘除四个运算符中的任何一种,通过split将字符串分隔成一个一个数字

>>> tmp

[‘8‘, ‘7‘, ‘5‘, ‘6‘, ‘3‘]

split有个参数maxsplit,用于指定分割的次数

>>> tmp = re.split(r"[\+\-\*\/]",s, maxsplit = 2)

>>> tmp

[‘8‘, ‘7‘, ‘5+6/3‘]

利用分组的概念,split函数还可以保存被匹配到的分隔符,这个功能很重要。

>>> tmp = re.split(r"([\+\-\*\/])",s)

>>> tmp

[‘8‘, ‘+‘, ‘7‘, ‘*‘, ‘5‘, ‘+‘, ‘6‘, ‘/‘, ‘3‘]

sub

sub(pattern,repl,string,count=0,flags=0)

# pattern : 正则模型

# repl : 要替换的字符串或可执行对象

# string : 要匹配的字符串

# count:指定匹配个数

# flags : 匹配模式

sub函数类似字符串的replace功能,用指定的内容替换匹配到的字符,可以指定替换的次数。

>>> s = "hello world, i am pythoner!"

>>> s = re.sub(r"o","X",s)   # 将字符串s 中的“o”替换为 “X”

>>> s

‘hellX wXrld, i am pythXner!‘

sub 函数有一个高级用法,“分组引用“:首先在正则表达式里用括号建立了一个分组,然后在要替换进去的字符串里引用“\1”引用这个分组匹配到的内容,

>>> r = re.sub(r"(world)", r"<em>\1<em>", s)

>>> r

‘hello <em>world<em>, i am pythoner!‘

>>> r = re.sub(r"(world)", r"%%%%\1%%%%%", s)

>>> r

‘hello %%%%world%%%%%, i am pythoner!

flag

python的re模块为其主要的函数都设计了flag参数,被称为编译标志,比如 I , M, S等。编译标志可以修改正则表达式的一些运行方式,

可以使用全名如:IGNORECASE, 或缩写如I来引用他们。多个标志可以组合,如re.I | re.M 被设置成I 和 M 标志。

  • I (忽略大小写) IGNOGRECASE:   不区分大小写匹配
  • L(本地模式)     LOCALE : 使得\w, \W, \b, \B, \d, \D 依赖于本地设置
  • M(多行模式)   MULTILINE : 让正则表达式的 ^和$ 符号可以适应多行模式的字符串

例如字符串 s = "\nabc\n" 实际上它有三行

>>> import re

>>> s = "\nabc\n"

>>> re.search(r"^abc$",s)

>>>

>>> re.search(r"abc$",s)

<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>

>>> re.search(r"^abc",s)

>>>

>>> re.search(r"abc",s)

<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>

>>>

>>> re.search(r"^abc$",s,re.M)

<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>

>>>

>>> re.search(r"^abc",s,re.M)

<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>

>>>

>>> re.search(r"abc$",s,re.M)

<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>

  • S (匹配换行符)
  • DOTALL : 使“ . ”特殊字符完全匹配任何字符,包括换行,如果没有这个标志,"." 只能匹配出换行符外的任何字符
  • X (注释模式)
  • VERBOSE:当该标志被指定时,在正则表达式字符串中的空白,tab, 换行符被忽略,除非该空白符在字符类中或在反斜杠之后;这可以让你更清晰的组织和缩进表达式。它允许你将注释写入表达式,这些注释会被引擎忽略;注释用“#”号来表示,不过该符号不能在字符串或反斜杠之后。它的作用:一是让复杂难懂的表达式更易读,二十给表达式加注释。

下面的pat等同于r"\*([^\*]+)\*"

>>> pat = re.compile(r‘‘‘

\*           #  转义一个星号

(             # 左括号代表一个 组的开始

[^\*]+    # 捕获任何非星号的字符

)             # 右括号代表组的结束

\*           #  转义一个星号

‘‘‘,re.VERBOSE)

>>> obj = pat.search("hi ,this is a  *something* !")

>>> obj.group()

‘*something*‘

  • U  UNICODE:兼容模式。在字符串模式下被忽略(默认模式),在字节模式下被禁止。在python3之后,string和bytes被独立成两种不同的数据类型。在re模块中,不能用Bytes去匹配string或者用string匹配bytes,只能用string匹配string,bytes匹配bytes。

import re

s = "halo"

b = bytes(s, encoding="utf-8")

pat = bytes(‘ha‘, encoding="utf-8")

print("字符串s:%s" % s)

print("字节b:%s" % b)

print("字节类型正则表达式pat:%s" % pat)

obj_s = re.search(pat, b)

print("匹配结果: %s" % obj_s.group())

运行结果:

字符串s:halo

字节b:b‘halo‘

字节类型正则表达式pat:b‘ha‘

匹配结果: b‘ha 

当使用UNICODE模式时,将强制禁止使用bytes类型,一旦使用将报错。在string类型中,UNICODE是默认设置。

  • A  ASCII:对于string模式,使得\w, \W, \b, \B, \d, \D 只匹配ACSII码字符集,而不是整个UNICODE字符集(默认)。对于bytes模式,这个编译标志是默认设置,不需要特别指定。通常我们不关心这个些,但是对于那些频繁在各种语言或字符串打交道的代码就要小心了。
时间: 2025-01-15 03:46:07

python自动化开发学习【第六天】的相关文章

Python自动化开发学习12-MariaDB

关系型数据库 主流的关系型数据库大概有下面这些: Oracle : 甲骨文公司的企业级的数据库 SQL Server : 微软的 MySQL : 免费的数据库,现在也属于Oracle的旗下产品 MariaDB : 开源的数据库,MySQL的一个分支 PostgreSQL : 也是开源的 SQLite : 一款轻量级的数据库 DB2 : IBM的 RDBMS 术语 RDBMS(Relational Database Management System)即关系数据库管理系统,在开始之前,先了解下RD

Python自动化开发学习19-Django

接下来,我们把Django分为视图(View).路由系统(URL).ORM(Model).模板(Templates )这4块进行学习. 视图 提交数据 上节课已经用过 request.POST.get() 获取提交的数据了,现在来看看有多选框的情况,多选的话应该要提交多个数据.先写一个有单选.多选.下拉列表的html: <body> <form action="/choice/" method="post"> <p> 性别: &l

python自动化开发学习-9 socket网络编程

一. 简介 python提供了两个级别访问的网络服务: 低级别的网络服务支持节本的socket,它提供了标准的BSD sockets API,可以访问底层操作系统socket接口的全部方法. 高级别的网络服务模块socketserver,它提供了服务器中心类,可以简化网络服务器的开发. socket介绍 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix

Python自动化开发学习4-3

JSON 和 pickle 序列化:把数据对象变成字符串的形式,这样可以保存在文件中.反之就是反序列化 python自带的str()可以完成序列化,然后eval()可以反序列化,但是我们先把他们忘记.不知道适用范围是多大. 我们用json的规范来做序列化和反序列化. import json dica = {'name':'Alice',         'age':18,         'from':'ShangHai'         } stra = json.dumps(dica)  #

Python自动化开发学习5

模块 在模块中,我们可以定义变量.函数,还有类(这个还没学到).总之应该就是所有的代码.先建一个文件,取名为module,py,内容如下: # 一下是module.py的内容 string = "This is module,py" def say_hi():     print("Hi") def test():     return "test in module.py" 在上面的模块中我们定义了1个变量和2个函数,现在我们要在另外一个文件中

Python自动化开发学习14

Web的三个层次 网页设计思路是把网页分成三个层次,即:结构层(HTML).表示层(CSS).行为层(Javascript).形象的比喻,先是HTML捏了一个人,然后CSS则是给人穿上衣服,最后通过JS让人动起来. Web服务的本质 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端.用户向服务器发送一个请求.然后服务器响应,将数据和格式发回给客户端,然后断开这个连接.客户端收到返回的数据后,通过浏览器将数据按照一定的格式呈现出来.整个过程就是

Python自动化开发学习15-JavaScript和DOM

初识JavaScript JavaScript(后面都简写为js)是一门独立的语言.浏览器本身就具有js解释器. js的存在形式 和css类似,js代码要放在<script>标签中.同样和css类似,还可以写在一个js文件中,比如文件名就叫 commons.js ,然后在head中引入 <script src="commons.js"></script> ,src的值就是js的文件路径.<script type="text/javas

Python自动化开发学习16-前端内容综合进阶

css补充 这里再补充几个css的知识点,下面会用到 最小宽度-min-width 设置元素的最小宽度.举例说明,比如设置一个百分比的宽度,那么元素的宽度的像素值是会随着页面大小而变化的.如果设置一个最小的像素宽度,那么当变化到最小值之后,不会继续变小.在下面的例子中,会出现滚动条,保证元素的宽度: <body> <div style="height: 80px;width: 100%;background-color: blue;min-width: 800px;"

Python自动化开发学习17

jQuery学习之前 jQuery 是 JavaScript 的一个类库,类似 python 中的模块.jQuery在线手册:http://jquery.cuishifeng.cn/官网:http://jquery.com/ 版本选择 目前jQuery有三个大版本:1.x. 2.x. 3.x.教学推荐使用1.x的最新版本,这个版本兼容IE低版本.去官方页面:http://code.jquery.com/ ,可以获取到最新的版本,我这会用的是 jquery-1.12.4 . 添加jQuery 前面