Python 高级编程

1. 正则表达式

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。

re.match与re.search

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。

re.match函数

flags 是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等, 如下:

可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组 ,在这种情况下它将返回一个包含那些组所对应值的元组。

groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组 。 

re.search 函数

re.search 扫描整个字符串并返回第一个成功的匹配。

(其用法同re.match)

re.sub函数

  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式。

这两个参数可选。

repl 参数可以是一个函数 :

compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

flags 可选,表示匹配模式,比如忽略大小写,多行模式等(同上)

当匹配成功时返回一个 Match 对象,其中:

  •  方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用  或 ;
  •  方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
  •  方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
  •  方法返回 。

findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

  • pos 可选参数,指定字符串的起始位置,默认为 0。
  • endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

re.finditer函数

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.split函数

split 方法按照能够匹配的子串将字符串分割后返回列表。

 maxsplit : 分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。

正则表达式模式

 

2. 络编程

socket()函数

用 socket() 函数来创建套接字,语法格式如下:

  • family: 套接字家族可以是 AF_UNIX 或者 AF_INET
  • type: 套接字类型可以根据是面向连接的还是非连接分为或
  • protocol: 一般不填默认为0.

Socket 对象(内建)方法

 

下面是实例:

第一步,编写服务器端代码并运行如下:

 运行服务器端代码后,看到服务器端处于运行状态,持续监听来自客户端的链接和访问。

第二步, 编写客户端代码并运行如下:

 

 运行客户端代码后,接收到了来自服务器端的信息,同时发现客户端程序运行随后结束,关闭链接。

第三步, 回头查看服务器端。

发现服务器端识别了与客户端的链接地址和端口,同时服务器仍然处于运行状态,持续监听。

 例子成功完成。

Python 络编程的一些重要模块:

3. SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

创建 SMTP 对象语法如下:

参数说明:

  • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:python.com,这个是可选参数。
  • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口 ,一般情况下SMTP端口 为25。
  • local_hostname: 如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。

SMTP对象使用sendmail方法发送邮件,语法如下:

参数说明:

  • from_addr: 邮件发送者地址。
  • to_addrs: 字符串列表,邮件发送地址。
  • msg: 发送消息

这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

 发送邮件实例:

发现抛出异常,异常信息显示目标机器拒绝链接。

待处理 。。。

4. 多线程

Python3 线程中常用的两个模块为:

  • _thread
  • threading(推荐使用)

thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用”thread” 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。

_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。

threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法。

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:

 执行以上程后可以按下 ctrl-c 退出。

使用 threading 模块创建线程

可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即它调用了线程的 run() 方法。

例子:

运行结果:

线程同步 

使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下:

 运行结果:

线程优先级队列( Queue)

Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列 PriorityQueue。

这些队列都实现了锁原语,能够在多线程中直接使用,可以使用队列来实现线程间的同步。

Queue 模块中的常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False
  • Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当Queue.get(False)
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.put_nowait(item) 相当Queue.put(item, False)
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作

 

 运行结果:

5. Python3 解析 XML 文件

Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

XML例子文件如下:

使用 SAX 解析 xml 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月2日
下一篇 2022年2月2日

相关推荐