1.匹配单个字符
# ### 正则表达式 - 单个字符匹配
import re
'''
findall 把匹配的结果直接返回到列表中
lst = re.findall("正则表达式","要匹配的字符串")
'''
lst = re.findall("\d","UIUI uuiui898(*(* 神秘男孩xboy")
print(lst)
lst = re.findall("\D","UIUI uuiui898(*(* 神秘男孩xboy")
print(lst)
lst = re.findall("\w","UIUI uui!@#$$%%^%^898(*(* 神秘男孩xboy")
print(lst)#['U', 'I', 'U', 'I', 'u', 'u', 'i', '8', '9', '8', '神', '秘', '男', '孩', 'x', 'b', 'o', 'y']
lst = re.findall("\W","UIUI uui!@#$$%%^%^898(*(* 神秘男孩xboy")
print(lst) #[' ', '!', '@', '#', '$', '$', '%', '%', '^', '%', '^', '(', '*', '(', '*', ' ']
lst = re.findall("\s","123 45 6")
print(lst)
lst = re.findall("\S","123 45 6")
print(lst) #['1', '2', '3', '4', '5', '6']
strvar = """
本来无一物,何处惹尘埃, 无住 生心
"""
lst = re.findall("\n",strvar)
print(lst)
lst = re.findall("\t","慎勿信汝意,汝意 不可信")
print(lst)
lst =re.findall("[abc]","6767yuyua-=-=")
print(lst)
print(re.findall('a[abc]b','aab abb acb adb'))
print(re.findall('a[0123456789]b','a1b a2b a3b acb ayb'))
print(re.findall('a[0-9]b','a1b a2b a3b acb ayb'))
print(re.findall('a[abcdefg]b','a1b a2b a3b acb ayb adb'))
print(re.findall('a[a-g]b','a1b a2b a3b acb ayb adb'))
print(re.findall('a[ABCDEFG]b','a1b a2b a3b aAb aDb aYb'))
print(re.findall('a[A-G]b','a1b a2b a3b aAb aDb aYb'))
print(re.findall('a[0-9a-zA-Z]b','a-b aab aAb aWb aqba1b'))
print(re.findall('[0-z]','='))
print(re.findall('a[0-9][*#/]b','a1/b a2b a29b a56b a456b'))
print(re.findall('a[^-+*/]b',"a%b ccaa*bda&bd"))
print(re.findall('a[\^]b',"a^b"))
lst = re.findall(r'a\\b',r'a\b')
print(lst) # 显示为 ['a\\b']
print(lst[0]) # 当拿出来打印时,会变成原有的样子
lst = re.findall(r'a[\\]b',r'a\b')
print(lst)
print(lst[0])
2.匹配多个字符
# ### 正则表达式 - 多个字符匹配
import re
'''1) ? 匹配0个或者1个a '''
print(re.findall('a?b','abbzab abb aab'))
'''2) + 匹配1个或者多个a '''
print(re.findall('a+b','b ab aaaaaab abb'))
'''3) * 匹配0个或者多个a '''
print(re.findall('a*b','b ab aaaaaab abbbbbbb'))
'''4) {m,n} 匹配m个至n个a '''
print(re.findall('a{1,3}b','aaab ab aab abbb aaz aabb'))# aaab ab aab ab aab
print(re.findall('a{1}b','aaab ab aab abbb aaz aabb'))# ab ab ab ab ab
print(re.findall('a{1,}b','aaab ab aab abbb aaz aabb'))# aaab ab aab ab aab
"""
贪婪匹配 : 默认向更多次匹配 (回溯算法)
非贪婪匹配: 默认向更少次匹配 (语法在量词的后面加?号)
. 代表除了\n,可以匹配任意字符
.? .+ .* .{m,n}
回溯算法:从左到右进行匹配,直到再也匹配不到了,回头,拿离右边最近的一个值.
非贪婪匹配语法: (语法在量词的后面加?号)
.?? .+? .*? .{m,n}?
"""
strvar = "刘能和刘老根和刘铁棍子123子456"
lst = re.findall("刘.?",strvar)
print(lst) # 刘能 刘老 刘铁
lst = re.findall("刘.+",strvar)
print(lst) # ['刘能和刘老根和刘铁棍子123子456']
lst = re.findall("刘.*",strvar)
print(lst) # ['刘能和刘老根和刘铁棍子123子456']
lst = re.findall("刘.{1,100}",strvar)
print(lst) # ['刘能和刘老根和刘铁棍子123子456']
strvar = "刘能和刘老根和刘铁棍子123子456"
lst = re.findall("刘.??",strvar)
print(lst) # ['刘', '刘', '刘']
lst = re.findall("刘.+?",strvar)
print(lst) # 刘能 刘老 刘铁
lst = re.findall("刘.*?",strvar)
print(lst) # ['刘', '刘', '刘']
lst = re.findall("刘.{1,100}?",strvar)
print(lst) # 刘能 刘老 刘铁
lst = re.findall("刘.*子",strvar)
print(lst)
lst = re.findall("刘.*?子",strvar)
print(lst) #
"""
卡住左边界:\bw
卡住右边界:d\b
任何的正则表达式,字符创左边都加上r,防止转义.
"""
strvar = "word pwd zef"
lst = re.findall(r"\bw.*",strvar)
print(lst)
lst = re.findall(r".*d\b",strvar)
print(lst)
lst = re.findall(r".*?d\b",strvar)
print(lst)
lst = re.findall(r"\bw.*?d\b",strvar)
print(lst)
lst = re.findall(r"\bw\S*",strvar)
print(lst)
"""
^ 必须以 .. 开头
$ 必须以 .. 结尾
无论是^ 还是 $ ,都需要把字符串看成一个整体;
"""
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?爷$',strvar)) # ['大哥大嫂大爷']
print(re.findall("^g.*e",'giveme 1gfive gay')) #giveme 1gfive
3.匹配分组_函数
# ### 分组匹配
import re
"""
1) 正常情况下用()圆括号进行分组 可以用\1 反向引用第一个圆括号匹配的内容。
2) (?:正则表达式) 表示取消优先显示的功能
"""
print(re.findall('.*?_good','wusir_good alex_good secret男_good'))
print(re.findall('(.*?)_good','wusir_good alex_good secret男_good'))
print(re.findall('(?:.*?)_good','wusir_good alex_good secret男_good'))
strvar = "abcabcd"
lst = re.findall("abc|abcd",strvar)
print(lst)
lst = re.findall("abcd|abc",strvar)
print(lst)
strvar = "3.14 56 89.78 78sdfs"
lst = re.findall("\d+\.\d+",strvar)
print(lst)
strvar = "3.14 56 89.78 78sdfs"
lst = re.findall("\d+\.\d+|\d+",strvar)
print(lst)
lst = re.findall("\d+(\.\d+)?",strvar)
print(lst)
lst = re.findall("\d+(?:\.\d+)?",strvar)
print(lst)
lst = re.findall("171[0-9]{8}|135\d{8}","17188886666 13566668888 13366668888")
print(lst)
lst = re.findall("^171[0-9]{8}$|^135\d{8}$","17188886666")
print(lst)
"""
search 只匹配到一个就返回,返回的是对象
可以让分组的内容和正常匹配的结果同时显示;
想要拿到对象中的结果,使用group函数
findall 从左到右把所有符合条件的内容都返回到列表
不可以同时显示分组和正常匹配的结果
"""
obj = re.search("171[0-9]{8}|135\d{8}","17188886666 13566668888 13366668888")
print(obj)
res = obj.group()
print(res)
strvar = "www.baidu.com www.oldboy.com"
obj = re.search("(www)\.(baidu|oldboy)\.(com)",strvar)
res = obj.group()
print(res)
res = obj.group(1) # 显示第一个小括号里的内容
res = obj.group(2) # 显示第二个小括号里的内容
res = obj.group(3) # 显示第三个小括号里的内容
print(res)
res = obj.groups()
print(res)
lst = re.findall("(?:www)\.(?:baidu|oldboy)\.(?:com)",strvar)
print(lst)
strvar = "5*6-9/3" # 27
obj = re.search("\d+[*/]\d+",strvar)
def calc(strvar):
if '*' in strvar:
num1,num2 = strvar.split('*')
return float(num1) * float(num2)
if '/' in strvar:
num1,num2 = strvar.split('/')
return float(num1) / float(num2)
res = obj.group()
print(res)
num = str(calc(res)) # 30.0
res2 = strvar.replace(res,num)
print(res2,type(res2)) #30.0-9/3
obj = re.search("\d+[*/]\d+",res2)
res3 = obj.group()
num = str(calc(res3))
print(num) # 3.0
res4 = res2.replace(res3,num)
print(res4,type(res)) #30.0-3.0
strvar = "
obj = re.search("<(.*?)>.*?<(.*?)>",strvar)
print(obj.groups()) #('h1', '/h1')
print("<==========>")
strvar = "
4.反射\魔术方法
# ### 类相关的魔术属性
class Human():
pass
class Man():
pass
class Woman():
pass
class Children(Man,Woman):
'''
成员属性: hair skin
成员方法: cry eat __drink
功能:描述小孩的特征
'''
hair = "black"
skin = "yellow"
# 绑定方法
def cry(self):
print("小孩会哭")
# 普通方法
def eat():
print("小孩下生会吃饼干")
def smile(self,func):
# \_\_name\_\_ 获取函数名
res = func.\_\_name\_\_
print(res) #ceshi
# 私有方法
def \_\_drink(self):
print("小孩喜欢喝奶奶")
obj = Children()
obj.abc = 10
print(obj.__dict__)
print(Children.__dict__)
print(Children.__doc__)
print(obj.__doc__)
def ceshi():
print(123)
obj.smile(ceshi)
print(obj.__class__)
res = Children.__bases__
print(res) # (
"""
"""
res = hasattr(obj,"hair")
res = hasattr(obj,"cry")
print(res) # True
res = hasattr(Children,"hair")
res = hasattr(Children,"eat123")
print(res)
res = getattr(obj,"hair")
func = getattr(obj,"cry")
print(res)
func() #小孩会哭
res = getattr(Children,"skin")
print(res)
func = getattr(Children,"eat")
func()
"""
def cry(self):
print("小孩会哭")
如果通过对象反射出来的绑定方法,里面的self 这个参数自动传递
如果通过类 反射出来的方法,里面的self 这个参数手动传递
"""
print("<==start==>")
func = getattr(obj,"cry") # self 系统自动传递
func()
func = getattr(Children,"cry")
func(13213213131212) # 让形参实参保持一致,self需要手动传递
print("<==end==>")
'''
res = input("请用户输入要调用的方法")
if hasattr(Children,res):
func = getattr(Children,res)
func()
'''
setattr(obj,"eye","蓝色的眼睛")
print(obj.eye)
setattr(Children,"ceshi111",lambda : print("ceshi111"))
Children.ceshi111()
"""
import types
types.MethodType(函数,obj)
"""
delattr(obj,"eye")
delattr(Children,"ceshi111")
import sys
print(sys.modules)
"""
{'builtins':
'sys':
'_frozen_importlib':
'_imp':
'_warnings':
'__main__':
'encodings.latin_1':
'sitecustomize':
"""
mod = sys.modules['__main__'] #
def func1():
print("这是func1方法")
def func2():
print("这是func2方法")
def func3():
print("这是func3方法")
while True:
res = input("请选择要调用的函数")
# 判断是否存在当前方法
if hasattr(mod,res):
# 通过字符串反射该方法
func = getattr(mod,res)
func()
else:
print("没有当前方法")
5.tcp发送消息
tcp三次握手过程
tcp四次挥手过程
网络中包的传输过程
socket所在位置
[server端] # ### 服务端
import socket
sk = socket.socket()
'''bind( 元组 ) 默认本地ip 127.0.0.1 (ip,端口) '''
sk.bind( ("127.0.0.1",9000) )
sk.listen()
'''conn 是三次握手后的连接对象,addr是对方的ip和端口号'''
conn,addr = sk.accept()
print(conn)
print(addr)
"""
1kb = 1024B
1024kb = 1024 * 1024B
1mb = 1100000000
一发一收是一对,发和收要一一匹配
recv(字节)
"""
msg = conn.recv(1024)
print(msg.decode("utf-8"))
conn.send("你是个好人..".encode())
conn.close()
sk.close()
**[client端]
**
# ### 客户端
import socket
# 创建tcp对象
sk = socket.socket()
# 直接与服务器主机建立连接
'''connect( 元组 ) (ip,端口号)'''
sk.connect( ("127.0.0.1" , 9000) )
# send 用来发送消息,recv 用来接收消息
'''send(二进制字节流)'''
sk.send("我爱你".encode("utf-8"))
# 接收数据
# res = sk.recv(1024)
# print(res.decode())
# 关闭连接
sk.close()
6.tcp循环发送消息
[server端] # ### 服务端
import socket
sk = socket.socket()
'''bind( 元组 ) 默认本地ip 127.0.0.1 (ip,端口) '''
sk.bind( ("127.0.0.1",9000) )
sk.listen()
while True:
# 4.三次握手
'''conn 是三次握手后的连接对象,addr是对方的ip和端口号'''
conn,addr = sk.accept()
while True:
# 收消息
msg = conn.recv(1024)
print(msg.decode())
# 发消息
message = input("老弟,要发什么?>>>")
conn.send(message.encode("utf-8"))
if message == "q":
break
conn.close()
sk.close()
[client端] # ### 客户端
import socket
sk = socket.socket()
'''connect( 元组 ) (ip,端口号)'''
sk.connect( ("127.0.0.1" , 9000) )
while True:
# 发消息
message = input(">>>:")
sk.send(message.encode("utf-8"))
# 收消息
res = sk.recv(1024)
if res == b'q':
break
print(res.decode("utf-8"))
sk.close()
7.udp发送消息
[server端] # ### 服务端
""" 如果是udp的服务端 ,只能先接收数据 ,tcp服务端可以先发也可以先收 """
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind( ("127.0.0.1",9000) )
msg,cli_addr = sk.recvfrom(1024)
print(msg.decode("utf-8"))
print(cli_addr)
sk.close()
[client端] # ### 客户端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto( "你好".encode("utf-8") , ("127.0.0.1",9000) )
sk.close()
手机扫一扫
移动阅读更方便
你可能感兴趣的文章