1. 标准三流
import sys
sys.stdin:input 的底层
res = sys.stdin.readline()
sys.stdout:print 的底层
sys.stdout.write('输出的信息 \ n')
sys.stderr: 异常及 logging 默认打印方式的底层
sys.stderr.write('输出的信息 \ n')
2.logging 模块
操作日志的模块
日志: 日常的流水, 将程序运行过程中的状态或数据进行记录, 一般都是记录到日志文件中
在正常的项目中, 项目运行的一些打印信息, 采用 looging 打印到文件中, 这个过程就称之为 记录日志
- import logging
- # logging 为默认打印者, 名字叫 root, 配置采用以下方式
- h1 = logging.StreamHandler()
- h2 = logging.FileHandler('d.log')
- logging.basicConfig(
- # filename='my.log',
- # filemode='w',
- # stream=sys.stderr, # 往控制台打印采用具体的输出流
- format='%(asctime)s [%(levelname)s]- %(name)s: %(message)s',
- datefmt='%Y-%m-%d %H:%M:%S',
- level=logging.DEBUG, # 10, 代表 DEBUG 及 DEBUG 级别以上都能输出
- handlers=[h1, h2]
- )
- logging.debug("debug")
- logging.info("info")
- logging.warning("warning")
- logging.error("error")
- logging.critical("critical")
3.loggin 四大成员
1. 新建打印者
logger = logging.getLogger("Owen")
2. 创建句柄: 输出的位置
- stream_handler = logging.StreamHandler()
- a_file_handler = logging.FileHandler('a.log')
- b_file_handler = logging.FileHandler('b.log')
3. 打印者绑定句柄
- logger.addHandler(stream_handler)
- logger.addHandler(a_file_handler)
- logger.addHandler(b_file_handler)
4. 设置格式
- fmt1 = logging.Formatter('%(asctime)s - %(msg)s')
- fmt2 = logging.Formatter('%(asctime)s [%(name)s] - %(msg)s')
5. 为句柄绑定输出格式
- stream_handler.setFormatter(fmt1)
- a_file_handler.setFormatter(fmt1)
- b_file_handler.setFormatter(fmt2)
- ogger.critical('msg')
4.logging 常用方法
- import logging
- # 1. 创建 logger
- log1 = logging.getLogger('Owen')
- log2 = logging.getLogger('Zero')
- r_log = logging
- # 2.logger 设置级别
- log1.setLevel(logging.DEBUG)
- # 3. 设置句柄
- h1 = logging.StreamHandler()
- # 4. 设置句柄级别:
- # 1) 系统句柄默认级别 warning,
- # 2) 自定义的句柄级别默认同 logger, 也可以在 logger 基础上在加以限制
- h1.setLevel(logging.DEBUG)
- # 5.logger 添加句柄
- log1.addHandler(h1)
- # log1 可以打印 DEBUG 以上的信息, 但往不同位置打印, 采用不同句柄的二次级别限制
- h2 = logging.FileHandler('c.log')
- h2.setLevel(logging.WARNING)
- log1.addHandler(h2)
- log1.debug('debug')
- log1.info('info')
- log1.warning('warning')
- log1.error('error')
- log1.critical('critical')
- log2.critical('00000')
- r_log.critical('00000')
5. 配置文件的使用
- # 1. 配置
- LOGGING_DIC = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'formatters': {
- 'o_fmt1': {
- 'format': '%(name)s:%(asctime)s - %(message)s'
- },
- 'o_fmt2': {
- 'format': '%(name)s:%(asctime)s [%(levelname)s] - %(message)s'
- }
- },
- 'filters': {},
- 'handlers': {
- 'o_cmd': {
- 'level': 'DEBUG',
- 'class': 'logging.StreamHandler',
- 'formatter': 'o_fmt1'
- },
- 'o_file': {
- 'level': 'WARNING',
- 'class': 'logging.handlers.RotatingFileHandler',
- 'formatter': 'o_fmt2',
- 'filename': r'F:\python8 期 \ 课堂内容 \ day20 \ 代码 \ part4\logging.log', # 日志文件
- 'maxBytes': 1024*1024*5, # 日志大小 5M
- 'backupCount': 5, #日志文件最大个数
- 'encoding': 'utf-8', # 日志文件的编码
- }
- },
- 'loggers': {
- 'o_owen': {
- 'level': 'DEBUG',
- 'handlers': ['o_cmd', 'o_file']
- },
- 'o_zero': {
- 'level': 'DEBUG',
- 'handlers': ['o_file']
- }
- }
- }
- # 2. 加载配置
- import logging.config
- logging.config.dictConfig(LOGGING_DIC)
- # 3. 使用
- log = logging.getLogger('o_owen')
- log.warning('123')
6. 正则表达式
1) 什么是正则表达式
一组特殊符号组成的表达式, 用于描述某种规则. 该应用场景生活中随处可见.
例如: 让有志青年过上体面的生活, 这里面就由规则, 即有志青年.
2) 正则表达式的作用, 以及使用场景
1. 用于从字符串中匹配满足某种规则的内容, 多数用于爬虫应用程序
2. 判断字符串串内容是否满足某种规则, 多用于严重用户输入. 例如密码是否规范, 手机号是否正确等
学习重点
正则是一堆特殊符号组成的, 我们主要学习的就是这些特殊符号
元字符 | 描述 |
---|---|
\ | 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配 \ n。“\n”匹配换行符。序列 “\” 匹配 “\” 而“(”则匹配 “(”。即相当于多种编程语言中都有的“转义字符” 的概念。 |
^ | 匹配输入字行首。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 “\n” 或“\r”之后的位置。 |
$ | 匹配输入行尾。如果设置了 RegExp 对象的 Multiline 属性,$ 也匹配 “\n” 或“\r”之前的位置。 |
* | 匹配前面的子表达式任意次。例如,zo能匹配 “z”,也能匹配“zo” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次 (大于等于 1 次)。例如,“zo+” 能匹配 “zo” 以及“zoo”,但不能匹配“z”。+ 等价于{1,}。 |
{n } | n 是一个非负整数。匹配确定的 < span ztid="185" ow="353" oh="17">n 次。例如,“o{2}”不能匹配 “Bob” 中的 “o”,但是能匹配“food” 中的两个 o。 |
{n ,} | n 是一个非负整数。至少匹配 < span ztid="203" ow="376" oh="47">n 次。例如,“o{2,}”不能匹配 “Bob” 中的 “o”,但能匹配“foooood” 中的所有 o。“o{1,}”等价于 “o+”。“o{0,}” 则等价于“o*”。 |
{n ,m } | m 和 < span ztid="225" ow="373" oh="47">n 均为非负整数,其中 < span ztid="229" ow="373" oh="47">n <=m 。最少匹配 < span ztid="237" ow="373" oh="47">n 次且最多匹配 < span ztid="241" ow="373" oh="47">m 次。例如,“o{1,3}”将匹配 “fooooood” 中的前三个 o 为一组,后三个 o 为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配 “do” 或“does”。? 等价于{0,1}。 |
? | 当该字符紧跟在任何一个其他限制符(,+,?,{ n},{ n,},{ n, m*})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串 “oooo”,“o+” 将尽可能多地匹配 “o”,得到结果[“oooo”],而“o+?” 将尽可能少地匹配“o”,得到结果 [‘o‘, ‘o‘, ‘o‘, ‘o‘] |
. 点 | 匹配除 “\n” 和 "\r" 之外的任何单个字符。要匹配包括 “\n” 和 "\r" 在内的任何字符,请使用像 “[\s\S]” 的模式。 |
x|y | 匹配 x 或 y。例如,“z|food”能匹配 “z” 或“food”(此处请谨慎)。“[zf]ood”则匹配 “zood” 或“food”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配 “plain” 中的“a”。 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“abc ”可以匹配 “plain” 中的 “plin” 任一字符。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配 “a” 到“z”范围内的任意小写字母字符。注意: 只有连字符在字符组内部时, 并且出现在两个字符之间时, 才能表示字符的范围; 如果出字符组的开头, 则只能表示连字符本身. |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“a-z ”可以匹配任何不在 “a” 到“z”范围内的任意字符。 |
\b | 匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的 “匹配” 有两种概念,一种是匹配字符,一种是匹配位置,这里的 \ b 就是匹配位置的)。例如,“er\b”可以匹配 “never” 中的 “er”,但不能匹配“verb” 中的 “er”;“\b1” 可以匹配 “1_23” 中的 “1 ”,但不能匹配“21_3” 中的“1_”。 |
\B | 匹配非单词边界。“er\B”能匹配 “verb” 中的 “er”,但不能匹配“never” 中的“er” |
\s | 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 |
\S | 匹配任何可见字符。等价于 < sup class="md-footnote" ztid="347" ow="55" oh="17"> \f\n\r\t\v 。 |
\w | 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的 "单词" 字符使用 Unicode 字符集。 |
\W | 匹配任何非单词字符。等价于“A-Za-z0-9_ ”。 |
\d | 匹配一个数字字符。等价于[0-9]。grep 要加上 - P,perl 正则支持 |
\D | 匹配一个非数字字符。等价于 < sup class="md-footnote" ztid="377" ow="19" oh="17">0-9 。grep 要加上 - P,perl 正则支持 |
\n | 匹配一个换行符。等价于 \ x0a 和 \ cJ。 |
\r | 匹配一个回车符。等价于 \ x0d 和 \ cM。 |
\t | 匹配一个制表符。等价于 \ x09 和 \ cI。 |
( ) | 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存 9 个),它们可以用 \1 到 \ 9 的符号来引用。 |
(?:pattern) | 非获取匹配,匹配 pattern 但不获取匹配结果,不进行存储供以后使用。这在使用或字符 “(|)” 来组合一个模式的各个部分时很有用。例如 “industr(?:y|ies)” 就是一个比 “industry|industries” 更简略的表达式。 |
| | 将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配 "it belongs to him" 和 "it belongs to her",但是不能匹配 "it belongs to them."。注意:这个元字符不是所有的软件都支持的。 |
首先介绍的是 re 模块的 findall 方法, 该方法用于从字符串中获取所有匹配成功的内容:
- import re
- res = re.findall("表达式","字符串内容")
- # 该方法得到一个列表
- print(res)
- search
仅获取第一个匹配的内容
match
从字符串开始处开始匹配
compile
得到一个的表达式对象, 后期可以重复使用
split
使用正则表达式来切分字符串
来源: http://www.bubuko.com/infodetail-3053108.html