python string.md
string
包含用于处理文本的常量和类。string模块始于Python的最早版本. 2.0版本中, 许多之前只在模块中实现的函数被转移为string对象的方法. 之后的版本中, 虽然这些函数仍然可用, 但是不推荐使用, 并且在Python 3.0中将被去掉. string模块也包含了一些有用的常量和类来处理字符串和unicode对象, 后面的讨论会集中在这个方面.
Functions
- string.capwords(s, sep=None):使用str.split()将参数分成单词,使用str.capitalize()大写每个单词,并使用str.join()。如果可选的第二个参数sep不存在或None,空格字符将被单个空格替换,前导和尾随空格将被删除,否则sep 用于拆分和连接字。
举例
capwords()将一个字符串所有单词首字母大写.
import string
s = 'The quick brown fox jumped over the lazy dog.'
print(s)
print(string.capwords(s))
得到的结果和调用split(), 将结果列表中的每个单词首字母大写, 然后调用join()连接这些单词这一系列动作的结果相同.
The quick brown fox jumped over the lazy dog.
The Quick Brown Fox Jumped Over The Lazy Dog.
Templates
字符串模板是作为PEP 292的一部分添加的,目的是作为内置插值语法的替代。 若使用了 string.Template 的占位符, 前缀为$的单词就被认为是变量(如$var), 如果需要将其在上下文中区别出来的话, 也可以将变量名包括在大括号中(如${var}).
class string.Template(template):构造函数采用单个参数即模板字符串。
- substitute(mapping, **kwds):执行模板替换,返回一个新字符串。映射是任何类似于字典对象与键匹配的模板中的占位符。或者,您可以提供关键字参数,这些关键字在哪里的占位符。当给定映射和kwds并且存在重复时,来自kwds的占位符优先。
- safe_substitute(mapping, **kwds):像substitute(),除了如果映射和kwds缺少占位符,而不是引发KeyError异常,原始占位符将出现在生成的字符串中。此外,与substitute()不同,$的任何其他外观将简单地返回$,而不是提高ValueError 。
虽然其他例外情况仍然可能发生,但这种方法称为"安全"因为替换总是试图返回一个可用的字符串,而不是引发异常。在另一种意义上,safe_substitute()可能是安全之外的任何东西,因为它会默默地忽略包含悬挂分隔符,不匹配的大括号或不是有效的Python标识符的占位符的畸形模板。
举例
本例将使用%运算符和使用str.format()的新格式字符串语法比较简单的模板和类似的字符串插值。
import string
values = {'var': 'foo'}
t = string.Template("""
Variable : $var
Escape : $$
Variable in next: ${var}iable
""")
print('TEMPLATE:', t.substitute(values))
s = """
Variable : %(var)s
Escape : %%
Variable in next: %(var)siable
"""
print('INTERPOLATION:', s % values)
s = """
Variable : {var}
Escape : {{}}
Variable in next: {var}iable
"""
print('FORMAT:', s.format(**values))
在前两种情况中,触发器字符($或%)通过重复两次来转义。对于格式语法,两者都需要通过重复它们来转义。
TEMPLATE:
Variable : foo
Escape : $
Variable in next: fooiable
INTERPOLATION:
Variable : foo
Escape : %
Variable in next: fooiable
FORMAT:
Variable : foo
Escape : {}
Variable in next: fooiable
模板和字符串插值或格式之间的一个关键区别在于,参数的类型没有考虑进去。值被转换为字符串,字符串被插入到结果中。没有可用的格式化选项。例如,无法控制用于表示浮点值的数字的数量。
而使用模板的一个好处是调用 safe_substitute() 方法, 当模板需要的参数值没有全部提供时, 可以避免了异常的产生.
import string
values = {'var': 'foo'}
t = string.Template("$var is here but $missing is not provided")
try:
print('substitute() :', t.substitute(values))
except KeyError as err:
print('ERROR:', str(err))
print('safe_subsitute():', t.safe_substitute(values))
因为missing这个变量的值没有出现在参数字典里, 所以 substitue() 会引发一个KeyError异常. 而 safe_substitute() 则捕获了这个异常并将这个变量表达式保留在文本中.
ERROR: 'missing'
safe_subsitute(): foo is here but $missing is not provided
Advanced Templates
高级用法:您可以派生Template的子类来自定义占位符语法,定界符字符或用于解析模板字符串的整个正则表达式。若要做到这一点,可以重写这些类的属性:
- delimiter —— 这是描述占位符引入分隔符的文字字符串。默认值为$。注意,这不应该是正则表达式,因为实现将根据需要调用re.escape()。
- idpattern - 这是描述非支撑占位符模式的正则表达式(大括号会根据需要自动添加)。默认值为正则表达式
[_a-z][_a-z0-9]*
- flags - 在编译用于识别替换的正则表达式时应用的正则表达式标志。默认值为re.IGNORECASE。请注意,re.VERBOSE将始终添加到标记中,因此自定义idpattern必须遵守详细正则表达式的约定。
或者,您可以通过重写类属性模式提供整个正则表达式模式。如果你这样做,值必须是一个具有四命名捕获组的正则表达式对象。捕获组对应于上面,以及无效的占位符规则给出的规则:
- 转义 - 此组与转义序列匹配,例如$$。
- named - 此组与未支持的占位符名称匹配;它不应该在捕获组中包括分隔符。
- braced - 此群组与括号括起的占位符名称匹配;它不应该在捕获组中包括分隔符或大括号。
- invalid - 此组与任何其他分隔符模式(通常为单个分隔符)匹配,它应该显示在正则表达式的最后。
举例
如果string.Template的默认表达式无法满足你的要求, 你可以通过调整用于匹配模板正文中变量名的正则表达式来达到你的目的. 一种简单的方法就是改变delimiter和idpattern这两个类属性.
import string
class MyTemplate(string.Template):
delimiter = '%'
idpattern = '[a-z]+_[a-z]+'
template_text = '''
Delimiter : %%
Replaced : %with_underscore
Ignored : %notunderscored
'''
d = {
'with_underscore': 'replaced',
'notunderscored': 'not relaced',
}
t = MyTemplate(template_text)
print('Modified ID pattern:')
print(t.safe_substitute(d))
在本例中,替换规则被更改,因此分隔符是%而不是$,变量名必须在中间的某个地方包含一个下划线。 %notunderscored的模式不会被任何东西所取代,因为它不包含下划线字符。
Modified ID pattern:
Delimiter : %
Replaced : replaced
Ignored : %notunderscored
对于更复杂的更改,可以覆盖模式属性并定义一个全新的正则表达式。所提供的模式必须包含四个命名组,用于捕获已转义的分隔符、命名变量、变量名的加固版本和无效的分隔符模式。
import string
t = string.Template('$var')
print(t.pattern.pattern)
因为t.pattern是已经被编译的正则表达式, 我们只能通过它的pattern属性来看真实的字符串.
\$(?:
(?P<escaped>\$) | # Escape sequence of two delimiters
(?P<named>[_a-z][_a-z0-9]*) | # delimiter and a Python identifier
{(?P<braced>[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier
(?P<invalid>) # Other ill-formed delimiter exprs
)
如果希望创建一个新的模板, 如, 以{{var}}作为变量表达式, 可以使用这样的一个pattern:
import string
import re
class MyTemlate(string.Template):
delimiter = '{{'
pattern = r'''
\{\{(?:
(?P<escaped>\{\{)|
(?P<named>[_a-z][_a-z0-9]*)\}\}|
(?P<braced>[_a-z][_a-z0-9]*)\}\}|
(?P<invalid>)
)
'''
t = MyTemlate('''
{{{{
{{var}}
''')
print('MATCHES:', t.pattern.findall(t.template))
print('SUBSTITUTED:', t.safe_substitute(var='replaceent'))
即使named和braced模式是一样的, 仍然需要必须单独提供. 下面是输出:
MATCHES: [('{{', '', '', ''), ('', 'var', '', '')]
SUBSTITUTED:
{{
replaceent
Formatter
Formatter类实现了与str的format()方法相同的布局规范语言,它的特性包括类型强制、对齐、属性和字段引用、命名和位置模板参数,以及特定于类型的格式化选项。大多数时候,format()方法是这些特性的一个更方便的接口,但Formatter被作为一种构建子类的方式,对于需要变化的情况。
Constants
字符串模块包括一些与ASCII和数字字符集相关的常量。
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\n' % (name, value))
这些常量在处理ASCII数据时非常有用,但是由于在某种形式的Unicode中遇到非ASCII文本越来越常见,所以它们的应用程序是有限的。
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'
python string.md的更多相关文章
- python string module
String模块中的常量 >>> import string >>> string.digits ' >>> string.letters 'ab ...
- python string
string比较连接 >>> s1="python string" >>> len(s) 13 >>> s2=" p ...
- The internals of Python string interning
JUNE 28TH, 2014Tweet This article describes how Python string interning works in CPython 2.7.7. A fe ...
- Python string objects implementation
http://www.laurentluce.com/posts/python-string-objects-implementation/ Python string objects impleme ...
- Python string replace 方法
Python string replace 方法 方法1: >>> a='...fuck...the....world............' >>> b=a ...
- Python string interning原理
原文链接:The internals of Python string interning 由于本人能力有限,如有翻译出错的,望指明. 这篇文章是讲Python string interning是如何 ...
- python string与list互转
因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得转换成string. >>&g ...
- python string 文本常量和模版
最近在看python标准库这本书,第一感觉非常厚,第二感觉,里面有很多原来不知道的东西,现在记下来跟大家分享一下. string类是python中最常用的文本处理工具,在python的 ...
- Python String 方法详解
官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods 官网 公号:软测小生ruancexiaosheng 文档里的 ...
随机推荐
- 自定义MVC的Helper扩展方法
记得在开发ASP.NET时候,也经常性使用C#可以写自己义的扩展方法,如:http://www.cnblogs.com/insus/p/3154363.html 或http://www.cnblogs ...
- TRIZ解决问题方法
个人觉的成功是有规律的,那些成功的人士,都有一套处理事情的秘籍.只要我们的思维方式把那些秘籍融会贯通,并快速执行,我们有一天也会成功的. TRIZ解决问题的5点方法. 1.确定最终目标. 2.列出阻碍 ...
- 自定义一个可以动态折叠的UITAbleViewCell
看到code 4APP上有一个折叠的UITAbleViewCell,不过是swift的,所以自己尝试做一个简单的可折叠的UITAbleViewCell 主要实现一个可以折叠的UITAbleViewCe ...
- js 实现 Base64 编码的相互转换
干脆点,直接贴代码 1. 代码 function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZab ...
- java - 线程等待与唤醒
Java多线程系列--“基础篇”05之 线程等待与唤醒 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. w ...
- C++ 的那些坑 (Day 0)
C++ 的那些坑 (Day 0) 永远的for循环 其实这里要说的并不是for循环本身还是其中的计数变量的类型的选择. std::string s = "abcd" for (st ...
- 设计模式(14)--Command(命令模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transactio ...
- 【代码笔记】iOS-自定义alertView
一,效果图. 二,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewContro ...
- Microsoft MVP MSDN Magazine 最新期分享
下载地址:http://1105insight.com/portal/wts/uemcmQeeDyaq%5Ev2gAe6c3b0Djd 可在线或下载查看
- Android项目实战(三十):Fresco加载gif图片并播放
前言: 项目中图文混合使用的太多太多了,但是绝大部分都是静态图片. 然而项目开发中有这么一个需求:显示一个出一个简短的动画(一般都不超过3秒)演示 比如说:一个功能提供很多步骤来教用户做广播体操,那么 ...