欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2.3web服务器

程序员文章站 2022-03-02 23:04:14
...

一、正则表达式

  1. re模块的操作
    import re
    result=re.match("[Hh]ello",“hello,world”) # 匹配
    print(result.group()) # 使用group返回匹配到的结果
  2. 匹配单个字符
    . 匹配任意一个字符,除\n
    []匹配括号中列举的字符
    \d匹配数字
    \D匹配非数字
    \s匹配空白字符,eg:tab、\t、空格等
    \S匹配非空白字符
    \w匹配字母
    \W匹配单个字母
  3. 匹配多个字母
    *匹配前一个字符出现零次或者无限次
    +匹配前一个字符出现1次或者无限次
    ?匹配前一个字符出现0次或者1次
    {m}匹配前一个字符出现m次
    {m,n}匹配前一个字符穿线m到n次
  4. 匹配开头和结尾
    ^匹配开头,开头写上这个表示以这个之后的子母开头
    $匹配结尾,结尾写上这个表示以这个之前的字母结尾
import  re
email_list = ["[email protected]", "[email protected]", "[email protected]"]

for email in email_list:
    ret = re.match("[\w]{4,20}@163\.com$", email)
    if ret:
        print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
    else:
        print("%s 不符合要求" % email)
  1. 匹配分组
    | 匹配左右任何一个表达式
    (ab)将括号中的字符作为一个分组,还可以去除括号中的数据
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
print(ret.group())  # [email protected]
>>> ret = re.match("([^-]*)-(\d+)","010-12345678")
>>> ret.group()
'010-12345678'
>>> ret.group(1)
'010'
>>> ret.group(2)
'12345678'

\num:引用分组num匹配到的字符串

import re

labels = ["<html><h1>www.itcast.cn</h1></html>", "<html><h1>www.itcast.cn</h2></html>"]

for label in labels:
    ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)

(?P):起别名
(?P=name):引用别名为name分组匹配到的字符串

import re

ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
ret.group()

ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h2></html>")
ret.group()
  1. re高级用法
    1】match是从开头进行匹配,匹配完所有的结果才结束,我们可以通过括号和group(num)来进行提取;
import  re
a1=re.match("(\w+)","hello").group(1)
print(a1)

2】而search是只要匹配到一个符合正则的结果就会返回,不管你后面是否匹配到;

a2=re.search("\d{3}","电话:15294111014").group()
print(a2)

3】findall()这个函数可以匹配到所有满足该正则的结果

a3=re.findall("\d+","QQ:2303412579;电话:15294111014")
print(a3)

4】sub函数将匹配到的数字进行替换

import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
import re

def add(temp):
    strNum = temp.group()
    num = int(strNum) + 1
    return str(num)

ret = re.sub(r"\d+", add, "python = 997")
print(ret)

ret = re.sub(r"\d+", add, "python = 99")
print(ret)

5】split 根据匹配进行切割字符串,并返回一个列表

import re

ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
  1. 贪婪与懒惰
    在python中默认是贪婪的,我们可以通过在"*","?","+","{m,n}"后面加上?,使贪婪变成懒惰。
  2. r的作用
    Python中字符串前面加上 r 表示原生字符串

二、http协议

  1. http协议分析
    1】请求request
GET / HTTP/1.1  浏览器请求的方式
Host: 127.0.0.1:7890  请求的目标主机和端口
Connection: keep-alive  连接的方式
Upgrade-Insecure-Requests: 1   浏览器可以接收的格式
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3724.8 Safari/537.36  浏览器的版本
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br  能够接受的格式
Accept-Language: zh-CN,zh;q=0.9,ja;q=0.8  能够接收识别的语言
Cookie: csrftoken=Eq9dSHbMPoj6FlzpnmfutIT2bEhjJFoYaCZa97C1GpgXD01K2dNQahizP1K8HBXs

2】响应response
http使用的是tcp协议,请求的时候有请求头,响应的时候有响应头和响应体;

二、简单的web服务器

GET / HTTP/1.1
Host: 127.0.0.1:7890

hahaha

相关标签: web服务器