re模块练习

1.验证手机号是否合法

import re
phone_pat = re.compile('^(13\d|14[5|7]\d|15\d|166|17[3|6|7]|18\d)\d{8}$')
while True:
phone = input('请输入您的手机号:')
res = re.search(phone_pat, phone)
if res:
print('正常手机号')
else:
print('这不是一个手机号')
'''
* 手机号码
* 移动:134,135,136,137,138,139,150,151,157,158,159,182,187,188
* 联通:130,131,132,152,155,156,185,186
* 电信:133,134,153,180,189
147... 176...
'''
import re
# phone_num = '13789481229'
phone_num = input('phone>>>:')
# pattern = re.compile('^0\d{2,3}\d{7,8}$|^1[358]\d{9}$|^147\d{8}')
pattern = re.compile('^1[34578]\d{9}')
phone_match = pattern.fullmatch(phone_num)
if phone_match:
print(phone_match.group())
else:
print('\033[1;31mphone is error\033[0m')

2.验证邮箱是否合法

import re

# email = 'alice@163.com'
email = input('email>>>:')
# pattern = re.compile('\w+@\w+\.(com|cn)')
pattern = re.compile('[-_\w]+@[-_\w]+\.(com|cn|edu)')
email_match = pattern.fullmatch(email)
if email_match:
print(email_match.group())
else:
print('\033[1;31memail is error\033[0m') #re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email)

3.开发一个简单的python计算器,实现加减乘除及拓号优先级解析

用户输入  -  * ( (- +(-/) * (-*/ +  /*/* + * / )) - (-*)/ (-*) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
hint:
re.search(r'\([^()]+\)',s).group()#可拿到最里层的括号中的值
'(-40/5)'

参考 http://www.bubuko.com/infodetail-1729967.html

本章总结练习

1、logging模块有几个日志级别?

logging模块共5个级别,它们分别是:
DEBUG INFO WARNING ERROR CRITICAL

2、请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志

-- ::, - access - ERROR - account [] too many login attempts
import logging
#1.生成logger对象
logger =logging.getLogger("access")
logger.setLevel(logging.DEBUG)
#2.生成handler对象
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR) ##设置输出屏幕级别
fh = logging.FileHandler("access.log") #生成文件
fh.setLevel(logging.ERROR) ##设置输出文件级别
#2.1把handler对象绑定到logger
logger.addHandler(ch)
logger.addHandler(fh)
#3.生成formatter对象
#3.1把formatter对象绑定handler对象
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s- %(lineno)d- %(message)s') ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter) logger.error("account [1234] too many login attempts")

3、json、pickle、shelve三个区别是什么

首先,这三个模块都是序列化工具。
1. json是所有语言的序列化工具,优点跨语言、体积小.只能序列化一些基本的数据类型。int\str\list\tuple\dict
pickle是python语言特有序列化工具,所有数据都能序列化。只能在python中使用,存储数据占空间大.
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。
2. 使用方式,json和pickle用法一样,shelve是f = shelve.open('shelve_test')

4、json的作用是什么?

序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes

5、subprocess执行命令方法有几种?

有三种方法,他们分别是
run()方法
call()方法
Popen()方法

6、为什么要设计好目录结构?

1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。
      从而非常快速的了解这个项目。
2.可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。
        这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。

7、打印出命令行的第一个参数。例如

python argument.py luffy
打印出 luffy
import sys
print(sys.argv[1])

8、代码如下

'''
Linux当前目录/usr/local/nginx/html/
文件名:index.html
'''
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(index.html)))
print(BASE_DIR)
  1. 打印的内容是什么?        打印的内容是: /usr/local/nginx
  2. os.path.dirname和os.path.abspath含义是什么?  os.path.dirname是指定文件的目录;os.path.abspath指的是文件的绝对路径。

9、通过configparser模块完成以下功能

文件名为my.cnf

[DEFAULT]

[client]
port =
socket = /data/mysql_3306/mysql.sock

[mysqld]

#explicit_defaults_for_timestamp = true 要把它注释掉
port =
socket = /data/mysql_3306/mysql.sock
back_log =
basedir = /usr/local/mysql
tmpdir = /tmp
datadir = /data/mysql_3306
default-time-zone = '+8:00'
  1. 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
print(config['mysqld']['default-time-zone'] ) #08:00
config.set('mysqld','default-time-zone','+00:00')
config.write(open('my.cnf', "w"))
print(config['mysqld']['default-time-zone'] ) #+00:00
  1. 删除 explicit_defaults_for_timestamp
import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.remove_option('mysqld','explicit_defaults_for_timestamp')
config.write(open('my.cnf', "w"))
  1. 为DEFAULT增加一条 character-set-server = utf8
import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.set('DEFAULT','character-set-server','utf8')
config.write(open('my.cnf', "w"))

10、写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.

import random
import string
a = ''.join(random.sample(string.ascii_lowercase + string.ascii_uppercase + string.digits,6))
print(a)

11、利用正则表达式提取到 luffycity.com ,内容如下

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>luffycity.com</title>
</head>
<body>
</body>
</html>
import re
f = open('index.html','r',encoding='utf-8')
data = f.read()
#print(data)
print(re.findall('luffycity.com', data)) #['luffycity.com']

12、写一个用户登录验证程序,文件如下

1234.json

{"expire_date": "2021-01-01", "id": , "status": , "pay_day": , "password": "abc"}
  1. 用户名为json文件名,密码为 password。
  2. 判断是否过期,与expire_date进行对比。
  3. 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
import json
import time
username = input('请输入用户名(文件名):')
f = open('1234.json','r',encoding='utf-8')
data = f.read()
data1 = json.loads(data)
#print(data1['password'])
count = 0
while count < 3:
if (int(time.strftime('%Y')))-(int(data1["expire_date"][0:4])) > 0:
print('您的账户已过期')
exit()
if data1['status'] == 1:
print('您的账户已被锁定,无法登录')
exit()
password = input('请输入密码:')
if password == data1['password']:
print('登录成功') elif count == 2:
data1['status'] = 1
f1 = open('1234.json','w',encoding='utf-8')
json.dump(data1,f1) #修改json数据
print('您的账户已被锁定')
exit()
else:
print('您的密码有误,请重新输入')
count += 1

13、把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。

 "password": "900150983cd24fb0d6963f7d28e17f72"
#加入下面这个就可以
password = input('请输入密码:')
m = hashlib.md5()
m.update(password.encode())
if m.hexdigest() == data1['password']:
print('登录成功')

14、最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。
需求如下:

##目录结构为
├── account
│ ├── luffy.json
│ └── tesla.json
└── bin
└── start.py

当执行start.py时,出现交互窗口

  ------- Luffy Bank ---------
. 账户信息
. 转账
  • 选择1 账户信息 显示luffy的当前账户余额。
  • 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万

15、对上题增加一个需求:提现。
目录结构如下

├── account
│ └── luffy.json
├── bin
│ └── start.py
└── core
└── withdraw.py

当执行start.py时,出现交互窗口

   ------- Luffy Bank ---------
. 账户信息
. 提现
  • 选择1 账户信息 显示luffy的当前账户余额和信用额度。
  • 选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。

16、尝试把上一章的验证用户登陆的装饰器添加到提现和转账的功能上

17、对第15题的用户转账、登录、提现操作均通过logging模块记录日志,日志文件位置如下

 .
├── account
│ └── luffy.json
├── bin
│ └── start.py
└── core
| └── withdraw.py
└── logs
└── bank.log

14--17:

bin start.py

#Author:Kris

# -*- coding:utf-8 -*-
import os,sys
import json
import logging
from logging import handlers
core_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(core_path)
from core import withdraw _username = 'alice'
_password = ''
msg = '''
1. 账户信息
2. 转账
3. 提现
'''
json_path = os.path.join(core_path, 'account')
flag_login = False
logger = logging.getLogger('record') def log_record():
global logger
logger.setLevel(logging.DEBUG)
# fh = logging.FileHandler(os.path.join(core_path, 'logs/bank.log'),encoding='utf-8')
fh = logging.handlers.TimedRotatingFileHandler(filename=os.path.join(core_path, 'logs/bank.log'),when='S',interval=3,backupCount=3,encoding='utf-8')
logger.addHandler(fh)
f_formatter = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')
fh.setFormatter(f_formatter) def login(func):
def inner():
global flag_login
if not flag_login:
username = input('username:').strip()
password = input('password:').strip()
if username == _username and password == _password:
print('登录成功!')
flag_login = True
logger.info('登录成功')
else:
print('用户名或密码有误!')
else:
print('用户已登录,通过认证')
if flag_login is True:
func()
return inner
def print_info():
# 账户信息
luffy_data = json.load(open(os.path.join(json_path, 'luffy.json'), 'r', encoding='utf-8'))
print('account_balance:', luffy_data['account_balance'])
print('credit_account:', luffy_data['credit_account'])
@login
def transfer_account():
# 转账
luffy_data = json.load(open(os.path.join(json_path, 'luffy.json'), 'r', encoding='utf-8'))
tesla_data = {'account_balance': 750000}
luffy_data['account_balance'] = luffy_data['account_balance'] - tesla_data['account_balance'] * (1 + 0.05)
json.dump(luffy_data, open(os.path.join(json_path, 'luffy.json'), 'w', encoding='utf-8'))
json.dump(tesla_data, open(os.path.join(json_path, 'tesla.json'), 'w', encoding='utf-8'))
print('转账成功!')
logger.debug('转账成功')
@login
def withdraws_func():
# 提现
moneys = input('moneys>>>:').strip()
if moneys.isdigit():
moneys = int(moneys)
withdraw.withdraws(moneys, json_path, logger)
def main():
while True:
print("Luffy Bank".center(30, '-'))
print(msg)
num = input('num(q表示退出)>>>:').strip()
if not num:
continue
if num.isdigit():
num = int(num)
if num == 1: # 账号信息
print_info()
elif num == 2: # 转账
transfer_account()
elif num == 3: # 提现
withdraws_func()
elif num == 'q':
exit() if __name__ == '__main__':
log_record()
main()

core   withdraw.py

#Author:Kris
# -*- coding:utf-8 -*-
import os, json def withdraws(moneys, json_path, logger):
luffy_data = json.load(open(os.path.join(json_path, 'luffy.json'), 'r', encoding='utf-8'))
if moneys <= luffy_data['credit_account']:
luffy_data['credit_account'] = luffy_data['credit_account'] - moneys*(1+0.05)
json.dump(luffy_data, open(os.path.join(json_path, 'luffy.json'), 'w', encoding='utf-8'))
print('提现成功!')
logger.warning('提现成功')
else:
print('\033[0;31m提现金额大于信用额度了!\033[0m')
logger.error('提现金额大于信用额度')

练习题|python常用模块的更多相关文章

  1. Python常用模块——目录

    Python常用模块学习 Python模块和包 Python常用模块time & datetime &random 模块 Python常用模块os & sys & sh ...

  2. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

  3. Python常用模块中常用内置函数的具体介绍

    Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...

  4. python——常用模块2

    python--常用模块2 1 logging模块 1.1 函数式简单配置 import logging logging.debug("debug message") loggin ...

  5. python——常用模块

    python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的 ...

  6. python 常用模块之random,os,sys 模块

    python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...

  7. python常用模块之时间模块

    python常用模块之时间模块 python全栈开发时间模块 上次的博客link:http://futuretechx.com/python-collections/ 接着上次的继续学习: 时间模块 ...

  8. python常用模块之subprocess

    python常用模块之subprocess python2有个模块commands,执行命令的模块,在python3中已经废弃,使用subprocess模块来替代commands. 介绍一下:comm ...

  9. python常用模块之string

    python常用模块string模块,该模块可以帮我们获取字母.数字.特殊符号. import string #打印所有的小写字母 print(string.ascii_lowercase) #打印所 ...

随机推荐

  1. C# 与 SQL Server 的数据类型对应关系

    (一)C#与SQL Server 2005(或以下版本): C# C#取值 SQL Server SQL Server取值 System.DateTime samlltime System.Objec ...

  2. 无线DOS攻击

    1.无线连接状态 IEEE 802.11定义了一种客户端状态机制,用于跟踪工作站身份验证和关联状态.无线客户端和AP基于IEEE标准实现这种状态机制.成功关联的客户站停留在状态3,才能进行无线通信.处 ...

  3. 有关Linux的.a、.so和.o文件(转)【原文章有些错误,自己已更改】

    gcc 生成 .a静态库和 .so动态库 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库 ...

  4. SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter实战

    补充:SpringBoot启动日志 1.深入SpringBoot2.x过滤器Filter和使用Servlet3.0配置自定义Filter实战(核心知识) 简介:讲解SpringBoot里面Filter ...

  5. freeRTOS中文实用教程4--资源管理概述

    1.前言 多任务系统中存在一种潜在的风险.当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整的状态 2.并发抢占导致错误的场景 (1)访问外设 ...

  6. eMMC基础技术6:eMMC data读写

    1. 前言 data可以经data线从host发往device,也可以从device发往host 数据线以是1线(DATA0),4线(DATA0~DATA3),8线(DATA0~DATA7) 对每条数 ...

  7. nodejs xpath

    var fs = require('fs');var xpath = require('xpath');var dom = require('xmldom').DOMParser; // Read t ...

  8. SharePoint 2010 使用沙盒解决方案隐藏页面中的”元素”

    起因: 一朋友问我如何隐藏SharePoint 2010中"回收站"和"所有网站内容".我告诉他需要写点css,然后他就蒙圈了(他是英文专业). 解决方案: 一 ...

  9. C# 发送email邮件!

    利用C#邮件发送邮箱使用到两个类SmtpClient和MailMessage.可以把SmtpClient看做发送邮件信息的客户端,而把MailMessage看做需要发送的消息. 下面是我写的发送邮件的 ...

  10. React-Native 之 网络请求 fetch

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...