“一个不成熟男子的标志是为了某种事业英勇地死去,一个成熟男子的标志是为了某种事业卑微地活着。”
-------<麦田里的守望者>
小的时候总以为自己长大会变成很厉害的人。后来知道自己没希望了,那就变成成功圆满的人也可以啊。
再后来觉得,即使普通,只要度过快乐幸福的人生就好。
再后来,发现只要活着就行。对自己提出要求,只会令人痛苦。
-----------作者:崇九
知乎上看到的,不管如何,我被生了下来,家境也不优越,父母仍需奔波,已然不可能孑然一生, 第一次读<麦田里的守望者>在初中,感谢那些年无知的自我,不会过早发现世间的秘密. ^_^,加油,生活. 2019.9.1
第一章,正则表达式
简介,动机:
特殊符号和字符
- 使用择一匹配符号匹配多个正则表达式模式,(|)
- 匹配任意单个字符(.)
- 从字符串起始或者结尾或者单词边界匹配。(^ $)
- 创建字符集,([])
- 限定范围与否定,([^], -)
- 使用闭包操作符实现存在性和频数(*,+,?)
- 使用圆括号指定分组
- 表示字符集的特殊字符(\w \d)
- 扩展表示法
正则表达式和Python语言
- re模块,核心函数和方法
- 使用compile函数编译 正则表达式。
- 匹配对象已及group()和groups()
- 使用match()方法匹配字符串
- 使用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
- 匹配多个字符
- 匹配任何单个字符
- 创建字符集
#匹配多个字符串
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
- 重复,特殊字符及分组
重复,特殊字符以即分组
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)
- 匹配字符串的起始和结尾已及单词边界
#匹配字符串的起始位置和结尾已及单词边界
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)
- 使用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)
- 使用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)
- 在限定模式上使用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']
- 扩展符号:
#扩展符号:
#(?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)
一些正则表达式的实例:
- 在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)']
- 用正则表达式练习的数据生成器(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
- 匹配字符串:
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())
网路编程:
- 在服务器响应客户端请求之前,必须执行一些初步的设置流程来为之后的工作做准备。创建一个通信端点,能够使服务器监听请求。
- 套接字:计算机网络的数据结构,任何类型的通行在开始之前,网络应用程序必须创建套接字,可以将他们比电话擦孔,有两种类型的套接字,基于文件(AF_UNIX)的和面向网络(AF_INEF)的。
- 总的来说Python只支持AF_UNIX,AF_NETLINK,AF_TICP和AF_INET家族,在所有的家族中AF_INET使用最广泛。
- 套接字地址:主机-端口对,一个网络地址由主机号和端口号组成。
- 面向连接的套接字和面向无连接的套接字,
- 面向连接的套接字:提供可靠的不重复的序列化的数据交付,没有记录边界,意外着每条消息可以拆分为多个片段,且每天消息保证都可要到达目的地。即传输控制协议,创建TCP套接字,必须使用SOCK_STREAM 作为套接字类型,TCP套接字的名字是SOCK_STREAM基于流套接字的其中一种表示。
- 无连接套接字:在传输的过程中不需要建立连接,在数据传输过程中无法保证他的顺序性,可靠性和重复性。数据报保存了记录边界,消息是以整体发送的。主要有用户数据报协议,使用SOCK_DGRAM作为套接字,
Python的网络编程:
- socket()模块:这个模块中有一个socket()函数,该函数用于创建套机字对象,套接字也有自己的方法 集,这些方法可以实现基于套接字的网络通行。
- socket()模块函数,socket(socket_family(AF_UNIX\AF_INET),socket_type(SOCK_STREAM\SOCK_DGRAM), propocol=0)
- 创建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()
- 创建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()
- 执行tcp服务器可客户端:
等待连接!!....
....连接 来自: ('127.0.0.1', 51365)
等待连接!!....
- 创建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()
- 创建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()
- 执行udp服务器和客户端: