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 文档里的 ...
随机推荐
- 设计模式——适配器模式(type-c转3.5mm耳机口)
本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 本文简述适配器模式,考虑到java中没有多继承就只写了对象适配器模式,然后例子是怎么用转接口把3.5mm耳机插在 ...
- PHP DDos的几个防御方法详解
这类攻击有一个最大的特性,就是上传流量霎时增大,通常流量高达数十以至近百M,将整台效 劳器,以至将整台机柜的宽带堵住,使网站无法运转,而这样的攻击,我们无法从远程处理,一但那个phpshell运转,你 ...
- HDU3062(2-SAT)
Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU1203(01背包)
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 更改Outlook 2013中Exchange数据文件存放路径
昨天新入职目前所在的公司,在原公司一直都是直接使用Outlook设置用户名和密码后,然后将*.pst邮件的数据文件保存在其他盘符,以防止在更新操作系统时出现邮件丢失的情况:但是目前公司使用的是Exch ...
- DrawerLayout建立侧滑时,显示侧滑页面,底层页面仍可以有点击响应,解决办法。
第一感觉是下层仍有焦点,解决办法应该是侧方页面出现后,下层页面的焦点改为false,应该是动态去改变焦点的状态,但是不知道如何去实现. 然后再网上找到实现方法,感谢:http://blog.csdn. ...
- 我正在参加 CSDN 2018 年博客之星评选,希望大家能支持我
我正在参加 CSDN 2018 年博客之星评选,希望大家能支持我 我是[No. 001]号,感谢大家宝贵的一票 ^_^/ 投票地址:https://bss.csdn.net/m/topic/blog_ ...
- Randoop介绍、安装及环境变量配置
大体来说,开发人员开发源程序,测试人员找bug,中间人产品经理. 黑盒测试:(不看代码) 白盒测试: 1.基于覆盖:语句.分支(if.for.真假).方法 结构:顺序.分支(T or F,做出选择). ...
- iOS 开发多线程 —— GCD(1)
本文是根据文顶顶老师的博客学习总结而来,如有不妥之处,还望指出.http://www.cnblogs.com/wendingding/p/3807716.html 概览: /* 纯c语言,提供了非常多 ...
- RecyclerView--添加头部和底部
1.先构建WrapRecyclerAdapter /** * Description: 可以添加头部和底部的Adapter */ public class WrapRecyclerAdapter ex ...