标准三流

标准输入流:sys. stdin  # input的底层

标准输出流:sys. stdout     # print的底层

标准错误流:sys. stderr      # 异常及logging默认打印方式的底层

loggin模块
日志:记录日常的流水 => 将程序运行过程中的状态或数据进行记录,记录到日志文件中
import logging
logging配置:格式化输出 1)输出的方式 2)输出的格式 3)输出的位置
#基础配置如下:
logging.basicConfig(
filename='my_log.log',
filemode='w', #默认a追加
#stream = sys.stderr,  往控制台打印采用具体的输出流 ,只能往一个地方,要么文件,要么控台
format='%(asctime)s- %(name)s -%(levelname)s - %(module)s-%(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=logging.INFO,) #  10,代表DEBUG及DEBUG级别以上都能输出

五个日志级别,级别本身没有代表信息重要性的级别,人为约定信息的级别。
可以设置级别,打印满足对应级别的信息
logging.info('info') #10
logging.debug('debug') #20
logging.warning('warning') #30
logging.error('error') #40
logging.critical('critical') #50

#不能将日志信息按不同的配置【日志格式,日志种类、等】写到不同的文件

四大成员:
1. logger     对象
2. filter        一种过滤规则
3. handler   控制输出的位置句柄,如往文件1、文件2..控制台
4.formater  输出的格式
'''
 1.logger对象
logger1 = logging.getLogger('O_WEN') #不写默认是root

2.filter对象:过滤日志

3.handler对象
fh1 = logging.FileHandler('a1.log', encoding='utf-8',) # 默认mode='a',
fh2 = logging.FileHandler('a2.log',encoding='utf-8')
ch = logging.StreamHandler()  #打印到控制台

4.formater 控制输出格式
formater1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',)

formater2 = logging.Formatter(
fmt='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H: %S %p',
)

# 5.绑定logger对象与handler对象
logger1.addHandler(fh1)
logger1.addHandler(fh2)
logger1.addHandler(ch)

# 6.绑定hgandler与formater
fh1.setFormatter(formater1)
fh2.setFormatter(formater1)
ch.setFormatter(formater2)

# 7.设置logger级别,有logger对象与handle对象两层关卡,必须都放行,最终才会放行执行
# 通常二者的级别相同
logger1.setLevel(10)
fh1.setLevel(10)
fh1.setLevel(10)
ch.setLevel(10)

#8使用logger对象产生日志
logger1.info('egon给owen转帐1000个亿美元')

'''

re模块

# re就是正则,是有语法的字符串,用来匹配目标字符串的

data = 'https://www.baidu.com'
# 案例1,判断该数据是否是合法的url链接
# 合法的url链接应该满足:以https:// 或 http:// 开头,并且以 com 或 cn 结尾
# 字符串匹配,根据你规定的字符串,与目标字符串进行配对,如果能配对成功,代表目标字符串满足需求
# 正则表达式:是一个可以同时制定多个规则的字符串 data = 'https://www.baidu.com'
res = re.findall('https://www.baidu.com',data) # ('第一个参数是你所指定的字符串','第二个是目标字符串')
print(res)

单个字符匹配

 将目标字符串中的所有数字找出  \D 是\d的对立面,除了\d能找出的它都可以找出
data = '123zbc啦啦啦'
res = re.findall(r'\d',data) # \d 代表数字
print(res) # 将目标字符串中的字母找出
res = re.findall('[a-z]',data) # [a-z] 表示,在a~z 中的所有字母,基于ascii码
print(res) # re.I 是不区分大小写的匹配
print(re.findall(r'a','abcABC123abcABC',flags=re.I)) # 输出结果为['a', 'A', 'a', 'A'] # a|b | 符号表示或 此处表示a或b单个字符
print(re.findall(r'a|b','abcABC123abcABC',flags=re.I)) # 输出结果为 ['a', 'b', 'A', 'B', 'a', 'b', 'A', 'B'] # [abc] a或,或b 或c 单个字符,与|符号不同,[]内可以添加多个字符
print(re.findall(r'[abc]','abcABC123abcABC',flags=re.I))# 输出结果为['a', 'b', 'c', 'A', 'B', 'C', 'a', 'b', 'c', 'A', 'B', 'C'] # [^ab]非a 及非b 的所有单个字符 取反,除了指定的字符,其他的都输出,
print(re.findall(r'[^ab]','abcABC123abcABC')) # 输出结果 ['c', 'A', 'B', 'C', '1', '2', '3', 'c', 'A', 'B', 'C'] # [a-z],[A-Z],[0-9] 单个输出范围内的字符
print(re.findall(r'[a-z]','abcABC123abcABC')) # 结果['a', 'b', 'c', 'a', 'b', 'c']
print(re.findall(r'[A-Z]','abcABC123abcABC')) # 结果['A', 'B', 'C', 'A', 'B', 'C']
print(re.findall(r'[0-9]','abcABC123abcABC')) # 结果['1', '2', '3']
# 可以组合使用
print(re.findall(r'[0-9]|[A-Z]|[a-z]','abcABC123abcABC')) # 结果['a', 'b', 'c', 'A', 'B', 'C', '1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C']
# 但是如果只是需要输出单个的数字,建议使用 \d
print(re.findall(r'\d','abcABC123abcABC')) # 结果['1', '2', '3'] # \w == [a-zA-Z0-9]和一个_ 符号 而汉字也会理解为一个单个字母 而 \W 是\w的对立面
print(re.findall(r'\w','abcABC123哈哈!@#$%^_')) # 结果['a', 'b', 'c', 'A', 'B', 'C', '1', '2', '3', '哈', '哈', '_'] # \s 单个空的:空格,制表符,换页符 而\S 是\s的对立面
print(re.findall(r'\s','\f\n\r\t\v')) # 结果 ['\x0c', '\n', '\r', '\t', '\x0b'] # 单个汉字
print(re.findall(r'[\u4e00-\u9fa5]','abc..123哈哈#¥#_')) # 结果['哈', '哈'] 匹配多个字符
# . 会匹配除\n以外的所有单个字符
# print(re.findall(r'.','@#$%^&*\n\t\r')) # \n没有输出['@', '#', '$', '%', '^', '&', '*', '\t', '\r'] # 而 re.S 可以让 . 匹配所有单个字符
# print(re.findall(r'.','@#$%^&*\n\t\r',re.S)) # \n 可以输出了['@', '#', '$', '%', '^', '&', '*', '\n', '\t', '\r'] # 明确个数的重复
# {n}
# print(re.findall(r'a','aaabbb')) # 输出结果['a', 'a', 'a']
#
# print(re.findall(r'a{2}','aaabbb')) # 结果['aa'] {}内是前面字符的个数
#
# print(re.findall(r'ab','aabbabab')) # 结果['ab', 'ab', 'ab']
#
# print(re.findall(r'a{2}b{2}','aabbaabbababab')) # 结果['aabb', 'aabb']
#
# print(re.findall(r'ab{2}','aabbababaabb')) # 结果['abb', 'abb'] {}内的个数,只对前一个字符有效 # {n,} 匹配n到无数个,被称为贪婪匹配,在下面案例中,优先匹配个数多的,然后依次递减,直至最少需求
# print(re.findall(r'ab{2,}','abbababbabaabbabbbbbb')) # 结果['abb', 'abb', 'abb', 'abbbbbb'] # {,n} 匹配0-n个,ab{,2} 优先匹配abb,没有ab也可以,如果ab也没有,有a也会匹配到
# print(re.findall(r'ab{,2}','aababbabbabbbb')) # 结果['a', 'ab', 'abb', 'abb', 'abb'] # {n,m} 匹配n到m个,ab{1,3} 优先匹配最多的,然后依次递减,直到最后的字符
# print(re.findall(r'ab{1,4}','aababbabbbabbbb')) # 结果['ab', 'abb', 'abbb', 'abbbb'] # 特殊符号的重复
# *:匹配0-无数个
# print(re.findall(r'ab*','aababbabbbabbbb')) # 结果['a', 'ab', 'abb', 'abbb', 'abbbb'] # +:匹配1到无数个
# print(re.findall(r'ab+','aababbabbbabbbb')) # 结果['ab', 'abb', 'abbb', 'abbbb'] # ?:匹配0到1个
# print(re.findall(r'ab?','aababbabbbabbbb')) # 结果['a', 'ab', 'ab', 'ab', 'ab'] # 案例。匹配所有单词
# print(re.findall(r'[a-z]+','abc def hello print')) # 结果['abc', 'def', 'hello', 'print'] # 案列,包含c的所有字符
# print(re.findall(r'[a-z]*c','abc def hello acb zc')) # \b代表单词边界,用空格(字符串的结尾也包括)作为匹配规则
# print(re.findall(r'[a-z]+\b','abc def hello print')) # 结果['abc', 'def', 'hello', 'print']
# 案例,以c字符结尾的字符
# print(re.findall(r'[a-z]*c\b','abc def hello print acb zc')) # 结果['abc', 'zc']
分组匹配
url = 'http://www.baidu.com,http://www.youku.com'
# 案例。要求拿到url的域名 baidu youku ()分组后,就之匹配出括号中的内容,其他不会输出
print(re.findall(r'www.([a-z]+).com',url)) # 结果 ['baidu', 'youku'] # () 代表分组
# findall 匹配,如果匹配规则使用分组语法,只存放分组结果
print(re.findall(r'(www).([a-z]+).com',url)) # 结果[('www', 'baidu'), ('www', 'youku')] # 分组的顺序编号按照左边括号的前后顺序
print(re.findall(r'(((w)ww).([a-z]+).com)',url)) # 结果 [('www.baidu.com', 'www', 'w', 'baidu'), ('www.youku.com', 'www', 'w', 'youku')] # findall是全文匹配,可以从任意位置开始,匹配多次
# match非全文匹配,必须从头开始匹配,只能匹配一次 # 专门处理分组的方法:分组,分组编号,有名分组,取消分组
# 取消分组:必须写(),但是()为分组语法,我们只是想通过()将一些数据作为整体,所以必须加(),再取消分组
# (?:) 取消分组,只是作为整体 (?P<名字>)有名分组
url = 'www.baidu.com,www.youku.com'
res = re.match(r'((?:www).(?P<name>[a-z]+).com)',url)
print(res.group(1)) # 括号内的参数是位置参数,指向第几个分组 结果# www.baidu.com
print(res.group(2)) # 结果 baidu
print(res.group('name')) # 结果 baidu
多行匹配
s = """http://www.baidu.com
https://sina.com.cn
https://youku.com
abchttp://www.oldboy.com
"""
# 如果想将url链接都匹配出来-> 使用分组 使用()后,只会输出()中的内容
print(re.findall(r'(?:https://|https://).+(?:com|cn)', s))
# 判断以什么开头和结尾,使用分组组合判断,然后用?:来把分组功能解除,.是所有字符,而+号是相同字符出现的次数为无限个 # ^代表以什么开头,¥代表以什么结尾,必须结合flags = re.M来完成多行匹配
print(re.findall(r'^http.+com$', s, re.M))
其他使用方法
# 拆分,用空格拆分
s = 'a b ac def'
print(s.split(' ')) # 正则拆分 中括号内加入你所需要分割的符号
s = 'a b,ac@def'
print(re.split(r'[ ,@]', s)) # 正则替换,('目标字符','新字符',目标)
s = 'python abc python'
print(re.sub('python', 'Python', s)) # 结合分组可以完成信息的重组与替换
s = 'day a good!!!' # 新字符串 'a good good day!!!'
print(re.sub('(day) (a) (good)', r'today is \2 \3 \3 \1', s)) # 结果 today is a good good day!!!
# \数字表示它的顺序
正则匹配步骤
#  如果需要匹配\ 这个字符,字符串前面必须带r 和一个\ ,因为第一个\会做转义字符使用,
print(re.findall(r'\\','a\d\c\\')) # 结果['\\', '\\', '\\']
# 而且 \b 是具有特殊意义的字符,在匹配\时,是匹配不到的,需要在目标字符串前加r 转成原义字符串
print(re.findall(r'\\',r'a\b\c\\')) # 结果['\\', '\\', '\\', '\\'] print(re.findall(r'\n', '\n')) # ['\n']
print(re.findall(r'\d', '\d')) # []
print(re.findall(r'\\d', '\d')) # ['\\d'] re_obj = re.compile(r'\n') # 转换成匹配换行符的正则对象
res = re_obj.findall('\n')
print(res) # ['\n'] re_obj = re.compile(r'\\d') # 转换成匹配 \d 的正则对象
res = re_obj.findall('\d')
print(res) # ['\\d'] re_obj = re.compile(r'\d') # 转换成匹配 数字 的正则对象
res = re_obj.findall('\d') # \d不是数字
print(res) # [] re_obj = re.compile(r'\\n') # 转换成匹配 \n 的正则对象
res = re_obj.findall('\n') # 代表换行,不能被匹配
print(res) # []
res = re_obj.findall(r'\n') # 就代表\n,能被匹配
print(res) # ['\\n']
 


login 模块,re 模块的更多相关文章

  1. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  2. python27期day15:自定义模块、模块导入、模块的路径、模块的查找顺序、time、datetime、random、os、sys、作业题

    1.模块的介绍: py文件就是一个模块 2.模块的分类:内置模块:python标准库 200 第三方模块 自定义模块 3.为什么学习模块? 开发效率高,内置函数和模块 减少重复代码,分文件管理,有助于 ...

  3. python day 8: re模块补充,导入模块,hashlib模块,字符串格式化,模块知识拾遗,requests模块初识

    目录 python day 8 1. re模块补充 2. import模块导入 3. os模块 4. hashlib模块 5. 字符串格式:百分号法与format方法 6. 模块知识拾遗 7. req ...

  4. 【Python】[模块]使用模块,安装第三方模块

    一个.py文件就称之为一个模块(Model)按目录来组织模块的方法,称为包(Package)每一个包目录下面都会有一个__init__.py的文件内置函数1.使用模块 导入模块 import sys ...

  5. nodejs模块——fs模块

    fs模块用于对系统文件及目录进行读写操作. 一.同步和异步 使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式. 异步方法中回调函数的第一个参数总是留给异常参数(exce ...

  6. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  7. Python的模块,模块的使用、安装,别名,作用域等概念

    所谓的模块就是将不同功能的函数分别放到不同的文件中,这样不仅有利于函数的维护,也方便了函数的调用.在Python中,一个.py文件就是一个模块(Module). 在模块的上层有一个叫做包(Packag ...

  8. Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

    原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...

  9. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  10. nginx模块,模块的配置使用

    nginx模块官方模块(默认支持的)第三方模块 1. --with-http_stub_status_module nginx的客户端状态 配置syntax: sub_status;default:- ...

随机推荐

  1. Legendre公式和Kummer定理

    Legendre公式 对于质数\(p\),函数\(v_p(n)\)为\(n\)标准分解后\(p\)的次数 显然有 \[v_p(n!) = \sum\limits_{i = 1}^{\infty} \l ...

  2. Redis主从复制配置+哨兵模式

    架构设计: master:s0 slave:s1.s2 主机映射信息如下: 192.168.32.100 s0 192.168.32.101 s1 192.168.32.102 s2 1.安装Redi ...

  3. ajax请求自动刷新页面

    ajax是异步请求技术,可以实现页面的局部刷新.但是今天写代码的时候发现每次ajax之后都会发生整个页面的刷新,最后发现这是因为触发ajax事件的input标签的type设置为了submit,所以会产 ...

  4. MySQL 关于视图的操作

    -- 视图就是一条select 语句 执行后返回结果集,是一种虚拟表,是一个逻辑表 -- 方便操作,减少复杂的SQL语句,增加可读性,更加安全一些 create view demo_view as s ...

  5. python面向对象基础(三)内置方法 __xx__

    __str__和__repr__,__format__ 改变对象的字符串显示__str__,__repr__ 自定制格式化字符串__format__ #_*_coding:utf-8_*_ forma ...

  6. 对Sting类型的探讨

    string类型经常和基本数据类型一起被我们熟练运用,但却不被归为基本数据类型,他是特殊的引用类型.引用数据类型还有类,接口.数组.枚举类型和注解类型. 我们来看下jdk对他的解释: String是在 ...

  7. Redis实战(18)Redis位图巧用,节约内存

    序言 资料 https://www.cnblogs.com/luke44/p/12031078.html

  8. websocket聊天体验(二)

    上一篇说到后续可以支持:最近历史.表情+图片,顺便还实现了简易的音频和视频.暂时没有实现实时语音对讲,有待后续再研究.点开在线聊天页面,即可看到最近历史记录(18条). 聊天的底层数据都是基于txt文 ...

  9. python函数(一)

    今天记一下学到的python函数相关知识. 目录: 1.函数简介 2.函数定义 3.函数参数 第一部分:函数简介    我们在编程过程中往往会碰到这样的事情-----很多地方都用到了相同的一段代码.虽 ...

  10. LC 711. Number of Distinct Islands II

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...