Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。
re.match(pattern, string, flags=0)
flags 是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等, 如下:
可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
re.search(pattern, string, flags=0)
re.search 扫描整个字符串并返回第一个成功的匹配。
(其用法同re.match)
re.sub(pattern, repl, string, count=0, flags=0)
这两个参数可选。
repl 参数可以是一个函数 :
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
re.compile(pattern[, flags])
flags 可选,表示匹配模式,比如忽略大小写,多行模式等(同上)
当匹配成功时返回一个 Match 对象,其中:
group([group1, …])
方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()
或 group(0)
;start([group])
方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;end([group])
方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group])
方法返回 (start(group), end(group))
。在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
re.findall(pattern, string, flags=0)
或
pattern.findall(string[, pos[, endpos]])
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
split 方法按照能够匹配的子串将字符串分割后返回列表。
re.split(pattern, string[, maxsplit=0, flags=0])
maxsplit : 分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。
用 socket() 函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
SOCK_STREAM
或SOCK_DGRAM
下面是实例:
第一步,编写服务器端代码并运行如下:
运行服务器端代码后,看到服务器端处于运行状态,持续监听来自客户端的链接和访问。
第二步, 编写客户端代码并运行如下:
运行客户端代码后,接收到了来自服务器端的信息,同时发现客户端程序运行随后结束,关闭链接。
第三步, 回头查看服务器端。
发现服务器端识别了与客户端的链接地址和端口,同时服务器仍然处于运行状态,持续监听。
例子成功完成。
Python 网络编程的一些重要模块:
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
参数说明:
这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。
发送邮件实例:
发现抛出异常,异常信息显示目标机器拒绝链接。
待处理 。。。
Python3 线程中常用的两个模块为:
thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。
_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。
threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法。
Python中使用线程有两种方式:函数或者用类来包装线程对象。
函数式:
_thread.start_new_thread ( function, args[, kwargs] )
执行以上程后可以按下 ctrl-c 退出。
可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即它调用了线程的 run() 方法。
例子:
运行结果:
线程同步
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下:
运行结果:
Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列 PriorityQueue。
这些队列都实现了锁原语,能够在多线程中直接使用,可以使用队列来实现线程间的同步。
Queue 模块中的常用方法:
运行结果:
Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:
XML例子文件如下:
使用 SAX 解析 xml
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# 元素开始调用
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# 元素结束调用
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# 读取字符时调用
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("C:\\Dragon\Python\movies.xml")
运行结果:
运行结果:
使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:
例子:
如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据, 如下例子:
在对应文件夹下生成了data.json 文件,查看内容:
JSON 解码为 Python 类型转换对应表:
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。时间间隔是以秒为单位的浮点小数。每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。从返回浮点数的时间戳方式向时间元组转换,只要将浮点数传递给如localtime之类的函数。
pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。
软件包也可在 https://pypi.org/ 中找到。
目前最新的 Python 版本已经预装了 pip。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。因为本人例子中安装的是3.10.2 版本,所以应该是自带了,cmd检查如下:
显示版本21.2.4,证明自带了pip。
访问一下pip软件包管理网站如下:
pip下载安装软件命令如下:
下载安装包命令:
pip install some-package-name
移除软件包命令:
pip uninstall some-package-name
查看已经安装的软件包:
pip list
参考:Python3 教程 | 菜鸟教程