首页 > 编程语言 >《Python核心编程》第三版 读书笔记

《Python核心编程》第三版 读书笔记

时间:2022-12-12 17:02:59浏览次数:58  
标签:None group 读书笔记 Python 第三版 re print 接字 match


“一个不成熟男子的标志是为了某种事业英勇地死去,一个成熟男子的标志是为了某种事业卑微地活着。”

                                                                                                     -------<麦田里的守望者>

小的时候总以为自己长大会变成很厉害的人。后来知道自己没希望了,那就变成成功圆满的人也可以啊。
再后来觉得,即使普通,只要度过快乐幸福的人生就好。
再后来,发现只要活着就行。对自己提出要求,只会令人痛苦。

                                                                                              -----------作者:崇九

知乎上看到的,不管如何,我被生了下来,家境也不优越,父母仍需奔波,已然不可能孑然一生, 第一次读<麦田里的守望者>在初中,感谢那些年无知的自我,不会过早发现世间的秘密.   ^_^,加油,生活.   2019.9.1

第一章,正则表达式

简介,动机:

特殊符号和字符

  1. 使用择一匹配符号匹配多个正则表达式模式,(|)
  2. 匹配任意单个字符(.)
  3. 从字符串起始或者结尾或者单词边界匹配。(^ $)
  4. 创建字符集,([])
  5. 限定范围与否定,([^], -)
  6. 使用闭包操作符实现存在性和频数(*,+,?)
  7. 使用圆括号指定分组
  8. 表示字符集的特殊字符(\w \d)
  9. 扩展表示法

 正则表达式和Python语言

  1. re模块,核心函数和方法
  2. 使用compile函数编译 正则表达式。
  3. 匹配对象已及group()和groups()
  4. 使用match()方法匹配字符串
  5. 使用search()在一个字符串中查找模式(搜索与匹配的对比)。
# from 包名 import 模块名
import re
# match(模式,字符串),开始位置匹配
m = re.match('foo','foo')
# 如果 m 不为空
if m is not None: print(m.group()) #foo
m = re.match('foo','lrl')
if m is not None: print(m.group()) #
m = re.match('foo', 'food on the table')
print('长串:'+m.group()) #foo
m = re.match('foo', 'sefoo')
if m is not None:print(m.group()) #
#search,任意位置搜索。
m = re.search('foo','sefoo' )
if m is not None:print(m.group()) # foo
  1. 匹配多个字符
  2. 匹配任何单个字符
  3. 创建字符集
#匹配多个字符串
bt = 'bat|bet|bit'
bt = re.compile(bt)
m = re.match(bt,'bat')
if m is not None: print(m.group())
m = re.match('bat|bet|bit', 'bat')
if m is not None:print(m.group())
#匹配任何单个字符
anyand = '.end'
m = re.match(anyand, 'bend')
if m is not None:print(m.group())
# end
m = re.match(anyand, 'end')
if m is not None:print(m.group())
#
m = re.match(anyand, '\nend')
if m is not None:print(m.group())
#
m = re.search('.end', 'the end.')
if m is not None:print(m.group())
# end
#搜索小数点
patty= '3.14'
pi_patt = '3\.14'
m = re.match(pi_patt, '3.14')
if m is not None:print(m.group()) #3.14
m = re.match(patty,'3014')
if m is not None:print(m.group()) #3014

#创建字符集[]
m = re.match('[li][rui][long]','lrl')
if m is not None:print(m.group()) #lrl

m = re.match('[a-z]+','aaaa' )
if m is not None:print(m.group()) #aaaa
  1. 重复,特殊字符及分组
重复,特殊字符以即分组
m = re.match(patt, '[email protected]')
if m is not None: print(m.group()) #[email protected]
m = re.match(patt, '[email protected]') #[email protected]
if m is not None: print(m.group())

m = re.match('\w\w\w-\d\d\d', 'abc-xyz') #
if m is not None: print(m.group())

x = 1;
y = 2;
#变量的直接转换
(x,y) =( y,x)
print(x)
print(y)

m = re.match('(\w\w\w)-(\d\d\d)','abc-123')
#返回匹配串
if m is not None: print(m.group())
#返回子组
if m is not None:print(m.group(1))
if m is not None:print(m.group(2))
if m is not None: print(m.groups())
#group()通常用于以普通的方式显示所有的匹配部分
#groups()通常获取一个包含所有匹配子字符串的元组。
m = re.match('(ab)', 'ab')
def pring(m):
print('输出group()')
if m is not None: print(m.group())
print('输出groups()+以元组方式输出:')
if m is not None: print(m.groups())
print("输出group(i)")
if m is not None: print(m.group(1))
pring(m)
m = re.match("(a)(b)", 'ab')
pring(m)
  1. 匹配字符串的起始和结尾已及单词边界
#匹配字符串的起始位置和结尾已及单词边界
def pri(m):
if m is not None: print(m.group())

m = re.search('^The',"The end.")
pri(m)
m = re.search('^The',"sThe end.") # 无值
pri(m)
#\b用于匹配单词边界。\B用与不匹配边界。
m = re.search(r'\bthe', 'bite the dog')
pri(m)
m = re.search(r'\bthe' , "btthe")#无值
pri(m)
m = re.search(r'\Bthe', 'bithe dog') #the
pri(m)
  1. 使用findall()和finalter()查找每一次出现的位置
#使用findall()和findlter()查找每一次出现的位置
#findall()返回一个数组,l类似一search
def prfin(m):
print(m)
m = re.findall('car', 'car')
prfin(m)
m = re.findall('car','scar')#['car']
prfin(m)
m = re.findall('car' , 'carry the bacar the car')#['car', 'car', 'car']
prfin(m)
s = "This and that."
#re.I忽略大小写 r'意思为不转义
m = re.findall(r'(th\w+) and (th\w+)', s, re.I) #[('This', 'that')]
print(m)
print("finditer的使用方式!!")
print("finditer的使用方式!")
m = [g.groups() for g in re.finditer(r'(th\w+) and (th\w+)', s, re.I)]
print(m)
  1. 使用sub()和subn()搜索和转换
#使用sub()和subn()搜索与替换,将正则表达式所匹配的进行替换。用来替换的部分通常是一个字符串。
#把sub(要替换的串,替换的串,替换后的子串)
m = re.sub('X','Mr. Smith', 'attn: X\n\nDear X,\n')
print(m)
# attn: Mr. Smith
#
# Dear Mr. Smith,
#把sub(要替换的串,替换的串,替换后的子串)返回替换的总数
m = re.subn("X",'Mr.Smith','attn: X\n\nDear X,\n')#('attn: Mr.Smith\n\nDear Mr.Smith,\n', 2)
print(m)
m = re.sub('[ae]', 'X', 'abcdef')#XbcdXf
print(m)
  1. 在限定模式上使用split()分隔字符串
#在限定模式上使用split()分割字符串
m = re.split(":", 'sta1:sta2:sta3')
print(m)
DATA = {
'SHNAG HAI,144',
'GUANGZHOU,522',
'LINGXIA,455'
}
for lam in DATA:
print(re.split(",",lam))
# ['LINGXIA', '455']
# ['GUANGZHOU', '522']
# ['SHNAG HAI', '144']
  1. 扩展符号
#扩展符号:
#(?i)忽略大小写匹配
m = re.findall(r'(?i)yes','yes? Yes. YES!!')#['yes', 'Yes', 'YES']
print(m)
m = re.findall(r'(?i)th\w+','The quickest way is throgh this tunnel.')#['The', 'throgh', 'this']
print(m)

m = re.findall(r'(?im)(^th[\w]+)', """
This line is the fie ,
another line,
that line ,it's basd th
""")
print(m)

一些正则表达式的实例:

  1. 在Linux下输入who获取当前系统的用户信息:解析获取到的信息,
import os
import re
# 将系统指令的执行信息写入f
f = os.popen('who','r')
for each in f:
# split方法用于指定分隔符分割,each,retrip用于去除空格。\s表示空格\t表示制表符
print re.split(r'\s\s+|\t', each.rstrip())
f.close()




[root@localhost pythonDemo.py]# python rewho.py
['root', 'tty1', '2019-07-29 10:52']
['root', 'pts/0', '2019-08-30 08:53 (192.168.36.1)']
['root', 'pts/1', '2019-08-30 10:17 (192.168.36.1)']
['root', 'pts/2', '2019-08-30 10:55 (192.168.36.1)']
  1. 用正则表达式练习的数据生成器(gendata.py)
from random import randrange, choice
# ascii_lowercase表示一个拥有26个小写字母的序列集合。
from string import ascii_lowercase as lc
from sys import maxint
from time import ctime
#定义一个元组
tlds = ('com', 'edu', 'net', 'org', 'gov')
#生成第5行和第10之间的输出,随机整数使用xrange(randrange(i,j))
for i in xrange(randrange(5,11 )):
# 获取的随机整数范围为2的32次方。
dtint = randrange(2**32)
# 由获取的随进整数的得到一个日期。
dtstr = ctime(dtint)
# 获取伪造邮件地址的登录名为4到7个字符
llen = randrange(4, 8)
# 随机选择4到7个小写字母,将所有的字符连接成一个字符串。choice()函数的功能就是接受一个序列。
# 然后返回该序列的随机元素。生成用户名
login = ''.join(choice(lc) for j in range(llen))
# 邮件地址的主域名不超过12个字符。但至少要比登录名一样长。
dlen = randrange(llen, 13)
# 生成邮件地址主域名。
dom = ''.join(choice(lc) for j in xrange(dlen))
# 指定格式把信息输出,
print '%s::%s@%s.%s::%d-%d-%d' % (dtstr, login, dom, choice(tlds), dtint, llen, dlen)





[root@localhost pythonDemo.py]# python genddata.py
Tue Mar 19 22:30:43 1985::[email protected]::480090643-4-5
Thu Jul 20 09:54:33 2084::[email protected]::3614896473-6-11
Thu Jul 3 23:42:06 2059::[email protected]::2824472526-5-5
Thu Dec 6 05:55:47 2096::[email protected]::4005582947-5-6
Fri Mar 16 20:54:13 2001::[email protected]::984747253-7-8
Fri Apr 2 23:51:47 1971::[email protected]::39455507-4-4
Sun Jan 30 07:12:35 2056::[email protected]::2716413155-4-6
Wed Jun 24 07:13:10 2026::[email protected]::1782256390-7-10
Wed Jun 5 02:51:10 1974::[email protected]::139603870-5-8
  1. 匹配字符串:
import re
data = 'Thu Dec 6 05:55:47 2096::[email protected]::4005582947-5-6'
patt = '^(\w{3})'
m = re.match(patt, data)

if m is not None:print(m.group())

网路编程:

  1. 在服务器响应客户端请求之前,必须执行一些初步的设置流程来为之后的工作做准备。创建一个通信端点,能够使服务器监听请求。
  2. 套接字:计算机网络的数据结构,任何类型的通行在开始之前,网络应用程序必须创建套接字,可以将他们比电话擦孔,有两种类型的套接字,基于文件(AF_UNIX)的和面向网络(AF_INEF)的。
  3. 总的来说Python只支持AF_UNIX,AF_NETLINK,AF_TICP和AF_INET家族,在所有的家族中AF_INET使用最广泛。
  4. 套接字地址:主机-端口对,一个网络地址由主机号和端口号组成。
  5. 面向连接的套接字和面向无连接的套接字,
  6. 面向连接的套接字:提供可靠的不重复的序列化的数据交付,没有记录边界,意外着每条消息可以拆分为多个片段,且每天消息保证都可要到达目的地。即传输控制协议,创建TCP套接字,必须使用SOCK_STREAM 作为套接字类型,TCP套接字的名字是SOCK_STREAM基于流套接字的其中一种表示。
  7. 无连接套接字:在传输的过程中不需要建立连接,在数据传输过程中无法保证他的顺序性,可靠性和重复性。数据报保存了记录边界,消息是以整体发送的。主要有用户数据报协议,使用SOCK_DGRAM作为套接字,

Python的网络编程:

  1. socket()模块:这个模块中有一个socket()函数,该函数用于创建套机字对象,套接字也有自己的方法 集,这些方法可以实现基于套接字的网络通行。
  2. socket()模块函数,socket(socket_family(AF_UNIX\AF_INET),socket_type(SOCK_STREAM\SOCK_DGRAM), propocol=0)
  3. 创建tcp服务器:
#! /usr/bin/env python
# 创建tcp服务器。
# ss = socket()创建服务器套接字
# ss.bind()套接字与服务器绑定
# ss.listen()监听连接
# inf_loop: 服务器无限循环
# cs = ss.accept()接受客户端连接
# comm——loop:通行循环
# cs.revc()/cs.send()对话(接受/发送)
# cs.close()关闭客户端套接字
# ss.close()关闭服务器套接字(可选)
from socket import *
from time import ctime
# 对bind()方法的标示,可以使用任何可用的地址,
HOST = ''
POST = 4747
BUFSIZ = 1024
ADDP = (HOST, POST)
# 分派了TCP服务器套接字tcpSocket,将套接字绑定到服务器地址已及开启TCP监听器的调用。
tcpSerSock = socket(AF_INET, SOCK_STREAM)
# 将地址与监听器绑定。
tcpSerSock.bind(ADDP)
# 设置并启动tcp监听器,参数传入连接请求的最大次数。
tcpSerSock.listen(5)
# 监听器无限循环
while True:
print( '等待连接!!....')
# 被动接受tcp客户端的连接,一直等待,直到连接到达。
tcpCliSock, addr = tcpSerSock.accept()
print('....连接 来自:', addr)
# 通信循环
while True:
# 接受tcp 的消息
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
# 发送tcp消息。
tcpCliSock.send('[%s] %s' %( bytes(ctime(),'utf-8'), data.decode('utf-8')))
# 关闭客户端套接字
tcpCliSock.close()
# 关闭服务器套件字
tcpSerSock.close()
  1. 创建tcp客户端:
#! /usr/bin/env python
# 创建TCP客户端
# cs = socket()创建客户端套接字
# cs.connect()尝试连接服务器
# comm_loop: 循环通信
# cs.send()/cs.recv()对话(发送/接收)
# cs.close()关闭客户端套接字

from socket import *

HOST = '127.0.0.1' # 本地回环地址
POST = 4747
BUFSIZ = 1024
ADDR = (HOST, POST)
# 建立tcp套接字
tcpCliSock = socket(AF_INET, SOCK_STREAM)
# 主动发起tcp服务器连接。
tcpCliSock.connect(ADDR)

while True:
# 输入数据
data = input('>')
if not data:
break
# 发送tcp消息
tcpCliSock.send(data.encode('utf-8'))
# 接收tcp消息
data = tcpCliSock.recv(BUFSIZ)
if not data:
print(data.decode('utf-8'))
# 关闭tcp连接
tcpCliSock.close()
  1. 执行tcp服务器可客户端:
等待连接!!....
....连接 来自: ('127.0.0.1', 51365)
等待连接!!....
  1. 创建udp服务器:
#UDP服务器
# ss = socket() 创建服务器套接字
# ss.bind() 绑定服务器套接字
# int_loop:服务器无限循环
# cs = ss.recvfrom()\ss.sendto() 接受发送UDP消息
# ss.colse() 关闭套接字

from socket import *
from time import ctime

HOST = ''
POST = 1111
BUFSIZ = 1024
ADDR = (HOST, POST)

udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)

while True:
print('等待连接')
# 接受UDP消息
data, addr = udpSerSock.recvfrom(BUFSIZ)
# 发送UDP消息
udpSerSock.sendto('[%s] %s' % (ctime(), data), addr)
print('received from and returned to:',addr)
udpSerSock.close()
  1. 创建udp客户端:
#!创建UDP客户端,
# cs = socket()创建客户端套接字
# comm_loop: 通行循环
# cs.sendto()\cs.recvfrom() #对话
# cs.close() 关闭客户端套接字。

from socket import *
from time import ctime

HOST = 'localhost'
POST = 1111
BUFSIZ = 1024
ADDR = (HOST, POST)

udpSerSock = socket(AF_INET, SOCK_DGRAM)


while True:
data = input('>')
if not data:
break
# 发送UDP消息
udpSerSock.sendto(data.encode(), ADDR)
# 接受UDP消息
data, ADDR = udpSerSock.recvfrom(BUFSIZ)
if not data:
break
print(data)
udpSerSock.close()
  1. 执行udp服务器和客户端:
  2.  

        嗯,感觉基础的那些没学好,直接看这本书有些吃力,而且Demo大都不能实现,Linux也用的不好,等吧基础在学学,把linux学好了之后在回来学这个吧,感觉就不应该看,浪费了一些时间.还不如看些别的.嗯,生活加油  ^_^.   2019.9.7

标签:None,group,读书笔记,Python,第三版,re,print,接字,match
From: https://blog.51cto.com/u_13474506/5931176

相关文章

  • 《JAVA8基础应用与开发》读书笔记
    第一章,JAVA技术体系架构JAVASE,(标准版),核心技术。小型桌面应用。 JAVAME,(微型版),嵌入式,电子产品程序。 JAVAEE,(企业版),web应用。涉及的技术面很广。计算机语言机制 ......
  • 《自然语言处理入门》读书笔记
    第一章,新手上路1.1自然语言与编程语言词汇量结构化:歧义性:容错性;易变性简略性1.2自然语言处理的层次文本:语音(语音识别),图像(光学符号识别),和文本。词法分析:中文分词(将......
  • 《Spring Cloud 微服务架构进阶》读书笔记
    前页随着DevOps和以Docker为主的容器技术的发展,云原生应用架构和微服务变得流行起来。云原生包含的内容很多,如DevOps、持续交付、微服务、敏捷等第一章,微服务架构介......
  • 第五天python的基本语法
    python语法之注释不写注释自己会看不懂三种注释的符号方式1:单行注释  #注释内容  方式2:多行注释   '''注释内容'''方式3:多行注释 """注释内容"""pycha......
  • 深度之眼(九)——python函数--面向过程的编程
    文章目录​​4.1函数的定义及调用​​​​4.1.1为什么要调用函数​​​​4.1.2函数的的定义及调用​​​​4.1.3参数传递​​​​4.1.4函数体与变量作用域​​​​4.1.......
  • 深度之眼(十三)——Python:类-面向对象的编程
    文章目录​​引子——类的引入​​​​7.1类的定义​​​​7.1.1类的命名​​​​7.1.2类的属性​​​​7.1.3类的方法​​​​7.2创建实例​​​​7.2.1实例的创建​......
  • 深度之眼(十四)——Python:文件、异常和模块
    文章目录​​零、导读​​​​8.1文件读写​​​​8.1.1文件的打开​​​​8.1.2文件的读取​​​​8.1.3文件的写入​​​​8.1.4既读又写​​​​8.1.5数据的存储与......
  • 读书笔记(二)——《被讨厌的勇气》
    世界是简单的,人生也是简单的人是可以改变的,人是可以获得乐趣的开篇——引言阿德勒的哲学从我的理解上来看,我理解了“世界是简单的,人生也是简单”,这个和我的世界观差不多。......
  • 读书笔记(三)——11.26
    文章目录​​一、早冥读写跑​​​​二、《刻意练习》​​​​三、《人类简史》​​​​四、《活法》​​一、早冥读写跑阅读感悟游戏心态,不要让事情本身舒服了,你的情绪和......
  • 《深入理解Java虚拟机》读书笔记
    第一部分,走进Java第二部分,自动内存管理机制:第二章:Java内存区域与内存溢出异常一,Java中,虚拟机自动管理内存机制,不在需要为每一个new操作去写配对的delete和free操作,不容易......