python cut函数_一天学会Python Web框架(七)工具函数

一、字符串操作包

string_helper.py是字符串操作包,主要对字符串进行检查、过滤和截取等处理。

#!/usr/bin/evn python

# coding=utf-8

import re

def check_string(text, pattern):

"""

检查字符串是否符合指定规则

:param text: 需要检查的字符串

:param pattern: 正式表达式,如:'^[a-zA-Z]+$'

:return: 含有指定字符时返回真,否则为假

"""

match = re.search(pattern, text)

if match:

return True

else:

return False

def is_email(text):

"""

验证字符串是否是email

:param text: 需要检查的字符串

:return: 符合返回True,不符合返回False

"""

return check_string(text, '[^\._-][\w\.-]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+$')

def is_phone(text):

"""

验证字符串是否是固定电话

:param text: 需要检查的字符串

:return: 符合返回True,不符合返回False

"""

return check_string(text, '\(?0\d{2,3}[) -]?\d{7,8}$')

def is_mobile(text):

"""

验证字符串是否是手机号码

:param text: 需要检查的字符串

:return: 符合返回True,不符合返回False

"""

return check_string(text, '^1[3578]\d{9}$|^147\d{8}$')

def is_letters(text):

"""

验证字符串是否全是字母

:param text: 需要检查的字符串

:return: 符合返回True,不符合返回False

"""

return check_string(text, '^[a-zA-Z]+$')

def is_idcard(text):

"""

验证字符串是否是身份证号码

:param text: 需要检查的字符串

:return: 格式正确返回True,错误返回False

"""

ic = IdentityCard()

return ic.check(text.upper())

def filter_str(text, filter='\|||&|%|~|\^|;|\''):

"""

滤掉字符串

:param text: 需要过滤的字符串

:param filter: 过滤内容(正则表达式)

:return: 去除特殊字符后的字符串

"""

if text:

return re.subn(filter, '', text)[0]

else:

return ''

def filter_tags(htmlstr):

"""

过滤HTML中的标签

:param htmlstr: 要过滤的内容

:return:

"""

re_cdata=re.compile('//]*//\]\]>',re.I) #匹配CDATA

re_script=re.compile(']*>[^',re.I)#Script

re_style=re.compile(']*>[^',re.I)#style

re_br=re.compile('
')#处理换行

re_h=re.compile('?\w+[^>]*>')#HTML标签

re_comment=re.compile('')#HTML注释

s=re_cdata.sub('',htmlstr)#去掉CDATA

s=re_script.sub('',s) #去掉SCRIPT

s=re_style.sub('',s)#去掉style

s=re_br.sub('\n',s)#将br转换为换行

s=re_h.sub('',s) #去掉HTML 标签

s=re_comment.sub('',s)#去掉HTML注释

#去掉多余的空行

blank_line=re.compile('\n+')

s=blank_line.sub('\n',s)

s=replaceCharEntity(s)#替换实体

return s

def replaceCharEntity(htmlstr):

"""

替换常用HTML字符

:param htmlstr: 要替换的字符

:return:

"""

CHAR_ENTITIES={'nbsp':' ','160':' ',

'lt':'

'gt':'>','62':'>',

'amp':'&','38':'&',

'quot':'"','34':'"',}

re_charEntity=re.compile(r'?(?P\w+);')

sz=re_charEntity.search(htmlstr)

while sz:

entity=sz.group()#entity全称,如>

key=sz.group('name')#去除&;后entity,如>为gt

try:

htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1)

sz=re_charEntity.search(htmlstr)

except KeyError:

#以空串代替

htmlstr=re_charEntity.sub('',htmlstr,1)

sz=re_charEntity.search(htmlstr)

return htmlstr

def string(text, is_return_null=False):

"""

sql字符串拼接专用函数

会在字符串两边添加'单撇号,用于生成数据库sql语句

:param text: 需要添加'的字符串

:param is_return_null: 是否返回null,是的话在字符串为空时返回null,否则返回''

:return:

"""

if not text is None and text != '':

return "'" + str(text) + "'"

elif not is_return_null:

return "''"

else:

return "null"

def cut_str(text, length):

"""

将字符串截取指定长度

:param text: 需要进行截取的字符串

:param length: 字符串保留的长度

:return:

"""

if not text or not isinstance(text, str):

return text

tem = ''

try:

tem = text.decode('utf8')

except:

pass

if not tem or tem == '':

try:

tem = text[0:length]

except:

tem = text

return tem[0:length]

class IdentityCard:

"""身份证号码验证类"""

def __init__(self):

self.__Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

self.__Ti = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

def calculate(self, code):

"""计算校验位"""

sum = 0

for i in range(17):

sum += int(code[i]) * self.__Wi[i]

return self.__Ti[sum % 11]

def check(self, code):

"""检查输入的号码是否正确"""

if (len(code) != 18):

return False

if self.calculate(code) != code[17]:

return False

return True

check_string()函数主要是用来检查字符串是否符合指定规则用的,它被is_开头的各个函数所调用。is_开头的几个函数怎么使用,请看测试用例。

#!/usr/bin/evn python

# coding=utf-8

import unittest

from common import string_helper

class StringHelperTest(unittest.TestCase):

"""字符串操作包测试类"""

def setUp(self):

"""初始化测试环境"""

print('------ini------')

def tearDown(self):

"""清理测试环境"""

print('------clear------')

def test_is_email(self):

self.assertEqual(string_helper.is_email('aaaaa'), False)

self.assertEqual(string_helper.is_email('aaaa@xxx.com'), True)

self.assertEqual(string_helper.is_email('xxx@xxx.com.xx'), True)

def test_is_phone(self):

self.assertEqual(string_helper.is_phone('aaaaa'), False)

self.assertEqual(string_helper.is_phone('12345678'), False)

self.assertEqual(string_helper.is_phone('01012345678'), True)

self.assertEqual(string_helper.is_phone('010-123456'), False)

self.assertEqual(string_helper.is_phone('010-12345678'), True)

self.assertEqual(string_helper.is_phone('010 12345678'), True)

self.assertEqual(string_helper.is_phone('0757 12345678'), True)

def test_is_mobile(self):

self.assertEqual(string_helper.is_mobile('aaaaa'), False)

self.assertEqual(string_helper.is_mobile('123456789'), False)

self.assertEqual(string_helper.is_mobile('13012345678'), True)

self.assertEqual(string_helper.is_mobile('14012345678'), False)

def test_is_letters(self):

self.assertEqual(string_helper.is_letters('123456'), False)

self.assertEqual(string_helper.is_letters('1ds2f12sdf'), False)

self.assertEqual(string_helper.is_letters('absbdsf'), True)

self.assertEqual(string_helper.is_letters('ADdfFSds'), True)

def test_is_idcard(self):

self.assertEqual(string_helper.is_idcard('123456789'), False)

self.assertEqual(string_helper.is_idcard('aaaaaaaaa'), False)

self.assertEqual(string_helper.is_idcard('340223190008210470'), False)

self.assertEqual(string_helper.is_idcard('34022319000821047X'), True)

if __name__ == '__main__':

unittest.main()

filter_str()函数用来将指定的特殊字符全部过滤掉

def test_filter_str(self):

print(string_helper.filter_str('aaa'))

print(string_helper.filter_str('aaa<>&\''))

print(string_helper.filter_str('aaa|&|%|~|^|;|\''))

执行结果:

-----ini------

aaa

aaa

aaa

------clear------

filter_tags函数将代码上的全部html标签过滤掉(网上找到来的代码)

def test_filter_tags(self):

print(string_helper.filter_tags('

aaa'))

执行结果:

------ini------

aaa

------clear------

string()函数主要用于拼接sql语句用的,用于在字符串的两边添加 ' 这个单撇号,如果is_return_null这个参数为True时,输入内容为空则返回null字符

def test_string(self):

print(string_helper.string(-1))

print(string_helper.string({'test': 'abc'}))

print(string_helper.string(''))

print(string_helper.string('aaa'))

print(string_helper.string('', True))

执行结果:(使用print打印到控制台的结果,字符串不输出""双引号,实际上存储到变量中时,下面内容都会加上双引号)

------ini------

'-1'

'{'test': 'abc'}'

''

'aaa'

null

------clear------

cut_str()函数会将输入的字符串按指定长度截取

def test_cut_str(self):

print(string_helper.cut_str('', 5))

print(string_helper.cut_str('aaa', 5))

print(string_helper.cut_str('将字符串截取指定长度', 5))

print(string_helper.cut_str('aa将字符串截取指定长度', 5))

执行结果:

-----ini------

aaa

将字符串截

aa将字符

------clear------

二、验证码生成包

verify_helper.py是验证码生成包,调用比较简单,这里就不再详细说明,到后面章节会有详细例子。

三、web操作包

web_helper.py是web操作包,主要是对web服务进行相关处理。它需要启动web服务后基于web服务下才行进行测试操作,不能直接运行测试用例进行测试。

#!/usr/bin/evn python

# coding=utf-8

import json

import re

import urllib.parse

from bottle import response, HTTPResponse, request

from common import json_helper

def get_ip():

"""获取当前客户端ip"""

try:

ip = request.remote_addr

except:

ip = ''

if not ip:

try:

ip = request.environ.get('REMOTE_ADDR')

except:

pass

return ip

def get_session():

"""获取当前用户session"""

return request.environ.get('beaker.session')

def return_msg(state, msg, data={}):

"""

接口输出数据到客户端

:param state: 状态码(公共参数,-1=出错,0=正常)

:param msg: 说明信息(公共参数)

:param data: 数据字典

:return: 返回组合后的json字符串

"""

msg = {

"state": state,

"msg": msg,

"data": data

}

# 将字典转为字符串输出

message = json.dumps(msg, cls=json_helper.CJsonEncoder)

return message

def return_raise(msg=''):

"""

直接终止程序,返回结果给客户端

修改bottle的异常状态码和异常返回body内容

:param msg: 输出内容

:return: 输出字符串

"""

res = response.copy(cls=HTTPResponse)

res.status = 200

res.body = str(msg)

raise res

def get_form(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True):

"""

获取客户端Form方式提交的参数值

:param args_name: 参数名

:param msg: 参数中文名称

:param is_strip: 字符串两端是否自动去除空格

:param lenght: 参数长度最大限制,0为不限制

:param is_check_null: 是否要求进行非空检测,True:当参数值为空时,返回错误提示客户端不能为空

:param notify_msg: 非必填项,当参数值为空时,默认返回“xxx 不允许为空”这个提示,如果这个变量有值,则直接返回这个变量值,即定制好的错误提示

:param is_check_special_char: 判断参数值是否含有特殊字符,True=默认会对特殊字符进行判断,False=不做判断处理,需要手动对接收参数值进行过滤处理,去除危险字符

:return: 返回处理后的参数

"""

args_value = ''

if request.method.upper() in ('POST', 'PUT', 'DELETE'):

try:

if request.json:

args_value = str(request.json.get(args_name, '')).strip()

else:

args_value = str(request.forms.get(args_name, '')).strip()

except:

args_value = str(request.forms.get(args_name, '')).strip()

if not args_value:

args_value = str(request.POST.get(args_name, '')).strip()

return __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char)

def get_query(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True):

"""

获取客户端Get方式提交的参数值

:param args_name: 参数名

:param msg: 参数中文名称

:param is_strip: 字符串两端是否自动去除空格

:param lenght: 参数长度最大限制,0为不限制

:param is_check_null: 是否要求进行非空检测,True:当参数值为空时,返回错误提示客户端不能为空

:param notify_msg: 非必填项,当参数值为空时,默认返回“xxx 不允许为空”这个提示,如果这个变量有值,则直接返回这个变量值,即定制好的错误提示

:param is_check_special_char: 判断参数值是否含有特殊字符,True=默认会对特殊字符进行判断,False=不做判断处理,需要手动对接收参数值进行过滤处理,去除危险字符

:return: 返回处理后的参数

"""

return __request_handle(__get(args_name), msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char)

def __get(args_name):

"""

从get请求中提取请求值(直接使用python的GET获取参数时,有时转换编码时会出现乱码,所以还是直接采用截取后直接转码比较好)

例如:http://127.0.0.1:81/manage/manager/?page=0&rows=20&sidx=id&sord=desc&name=%E5%BC%A0%E4%B8%89

:param args_name: 要取值的参数名:name

:return: 截取的编码值:%E5%BC%A0%E4%B8%89

"""

get = '?' + request.query_string

start_index = get.find('&' + args_name + '=')

if start_index == -1:

start_index = get.find('?' + args_name + '=')

if start_index == -1:

return ''

end_index = get.find('&', start_index + 1)

if end_index == -1:

return get[start_index + len(args_name + '=') + 1:]

else:

return get[start_index + len(args_name + '=') + 1:end_index]

def __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char):

"""

对客户端提交的参数进行各种判断与处理

:param args_value: 参数值

:param msg: 参数中文名称

:param is_strip: 字符串两端是否自动去除空格

:param lenght: 参数长度最大限制,0为不限制

:param is_check_null: 是否要求进行非空检测,True:当参数值为空时,返回错误提示客户端不能为空

:param notify_msg: 非必填项,当参数值为空时,默认返回“xxx 不允许为空”这个提示,如果这个变量有值,则直接返回这个变量值,即定制好的错误提示

:param is_check_special_char: 判断参数值是否含有特殊字符,True=默认会对特殊字符进行判断,False=不做判断处理,需要手动对接收参数值进行过滤处理,去除危险字符

:return: 返回处理后的参数

"""

# 如果参数为空,则返回该参数不允许为空的json串给前端

if is_check_null and not args_value:

if notify_msg:

return_raise(return_msg(-1, notify_msg))

else:

return_raise(return_msg(-1, "%s 不允许为空" % msg))

elif not args_value:

return args_value

# 把utf-8的url编码解码成中文字符

try:

args_value = urllib.parse.unquote(args_value)

except:

pass

# 替换特殊的空字符

args_value = args_value.replace(u'\xa0', u'')

# 是否字符串两端去空格

if is_strip:

args_value = args_value.strip()

# 判断是否超出指定长度

if lenght > 0 and len(args_value) > lenght:

return_raise(return_msg(-1, "%s 超出 %s 个字符" % (msg, lenght)))

# 如果参数含有特殊字符,则返回该参数不允许有特殊字符的json串给前端

if is_check_special_char:

re_result = re.search('\|||&|%|~|\^|;|\'', args_value)

if re_result:

return_raise(return_msg(-1, "%s 含有特殊字符,请重新输入" % msg))

return args_value

get_ip():获取当前客户端ip地址

get_session():获取当前客户的session

return_msg():生成统一的返回给客户端的内容(json格式)。输出内容有state:状态码,一般使用-1表示出现错误,0表示正常,可以根据需要进行修改或添加更多的状态码;msg:状态文说明,出错时返回出错内容提示;data:需要返回的其他内容全部会放在这里。

return_raise():当调用这个函数时,会直接终于代码的执行,直接将结果输出到客户端。

get_form():获取客户端Form方式提交的参数值

get_query():获取客户端Get方式提交的参数值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值