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. 一个极好的JavaScript学习网址

    JavaScript学习网址:https://javascript.info/ 网址界面如下,内容和排版都非常不错,内容也比较新,不像一些教程已经是好几年前的了.把这个教程浏览一遍,能够解答很多看代码 ...

  2. HDU 1162 Eddy's picture (最小生成树 prim)

    题目链接 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to be ...

  3. mysql 显示表字段及mysql系统信息

    参考链接: http://www.cnblogs.com/zhwl/archive/2012/08/28/2660532.html SHOW DATABASES                     ...

  4. python - str和repr方法:

    # python 内置__str__()和__repr__()方法: #显示自定制 # 示例1 # a = 123 # print(a.__str__()) # 示例2 class Test(): d ...

  5. shiro与Web项目整合-Spring+SpringMVC+Mybatis+Shiro(八)

    Jar包

  6. SpringMVC使用Hession发布远程服务

    (1)三个项目,Api(存放提供者和消费者共有的xx,例如实体类以及服务接口等等).Service(服务提供者).Provider(服务消费者) Api部分代码 package cn.coreqi.e ...

  7. PHP查看编译参数

    PHP查看编译参数 [root@test ~]# php -i|grep configure Configure Command => './configure' '--prefix=/usr/ ...

  8. kafka系列六、java管理kafka Topic

    package com.example.demo.topic; import kafka.admin.AdminUtils; import kafka.admin.RackAwareMode; imp ...

  9. C++:vector的用法详解

    原文地址:http://blog.csdn.net/hancunai0017/article/details/7032383 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于 ...

  10. linux命令 dirname

    功能: 获取给定路径的目录部分 利用man 查看dirname的说明如下: DESCRIPTION        Output each NAME with its last non-slash co ...