python标准库之文本系列 -- string模块尚未死亡

  在程序员的日常生活中,可能有许多的时间在处理文本,而在python当中,我们用那最显而易见的文本处理工具str类进行处理。什么find(),index(),count(),split(),join(),replace(),strip(),translate()等

  这些str对象的方法已经足够处理本文了,但是你可能还不知道以前这些方法是不属于str类管辖的,真正的持有者是另外一个模块,它的名字叫!!!string模块。string模块被“惨无人道的分割”,把大部分的函数都给了python的"亲儿子"str类,虽然大部分发东西string中已经没有,但是现在string模块还保留着一些常量和模板,我们用过Template模板,而这个模板就是string模块中一个重要的函数。我们可以用string.Template作为一种简便方法来构建比str对象特性(方法)更加丰富的字符串,它很好的支持用户可修改的模板,这些模板需要将动态的之插入到静态的文本中。接下来我们来看看string这位“老人”还留给了我们什么宝贵的经验--一个函数,一个模板,一个常量。

一个函数:capwords()

  我们在清洗数据的时候可能会遇到一些参差不齐的文本段,比如:

s = 'The quick brown fox jumped over the lazy dog.'

这个片段看上去很工整,但如果这是标题呢,那么我们要把每个单词的首字母改成大写该怎么办,对于str对象,我们可以用它 的方法,比如先分割,遍历处理,然后再连接。

s = 'The quick brown fox jumped over the lazy dog.'

def capword(text):
    list_name = []
    split_s = text.split()
    for i in split_s:
        list_name.append(i[0].upper()+i[1:])
    return " ".join(list_name)

capworld(s)

复杂吗?(不复杂!!!!)

好吧,不复杂,但是我还是要坚持啦啦capwords()函数,不接受反驳!

import string  #导入string模块

s = 'The quick brown fox jumped over the lazy dog.'

s = string.capwords(s)  #emmm....


我只想说,人生苦短,我用python!!!

一个模板string.Template("....")

这个模板是用于格式化字符串的,可能会用不到这个平时,因为有format()。

那为啥还存在这个模板呢??(小朋友你是否有很多问号?)

模板和字符串的格式化的一个关键区别就是,它不需要考虑参数的类型,单纯的值转换成字符串,再将字符串插入结果就行,没有一大堆格式化选项,不能控制参数的实际存在形式。很废,我觉得,但是它最重要的点在它的方法上。我们举个例子:

import string

values = {'person':'you'}

s = string.Template("$person is a $message !")  #你是一只猪!

try:
    print('substitute()  :',s.substitute(values))
except KeyError as err:
    print('ERROR:',str(err))
ERROR = s.safe_substitute(values)
print('该错误为',ERROR)

#运行。。。
ERROR: 'message'
safe_substitute(): you is a $message !


在我们确定已经提供了等量的参数时,我们可以用substitute()方法,但是当我们提供的参数不足时,我们可以使用safe_substitute()(安全替换),这个方法它会避免未能向模板提供所需要的所有参数时可能产生的异常,反而它会捕捉到这个错误并保留在文本中的变量表达式中。

一个常量:

这些常量在我们日常生活中可能会用到,比如说在re模块中当作pattern等等

在此之前我先把这些常量列举出来

ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
digits = '0123456789'
hexdigits = '0123456789abcdefABCDEF'
octdigits = '01234567'
printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
whitespace = ' \t\n\r\x0b\x0c'

当我们需要哪一个,就直接导入就行

最后我们也可以亲自动手来把这些打印出来,代码如下(打印方法不是唯一,有不足的地方请指出):

import string
import inspect

def is_str(value):
    return isinstance(value,str)
for name,value in inspect.getmembers(string,is_str):
    if name.startswith('_'):
        continue
    print("{!s} = {!r}".format(name,value))
        

这个代码中的{!s},{!r}与format()对齐的,至于为啥用!s,!r我就不细说了。

我们下周再见,希望大家能在python的开放世界找到属于自己的那个他,她,它~~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值