一、TEXT
string类是Python的文本处理工具,但是标准库中还有很多其他的工具,可以使高级文本操作变得简单。
string.Template 作为参数化字符串的一种简单方法,它超越了字符串或 unicode 类的功能。
textwrap模块包括通过限制输出的宽度、增加缩进和插入换行符来对取自段落的文本进行格式化的工具。
标准库包括两个与比较文本值有关的模块,超出了字符串对象所支持的内置平等和排序比较。正则表达式非常适用于在较大的数据集中寻找子字符串,将字符串与比另一个固定字符串更复杂的模式进行比较,并进行温和的解析。
difflib计算文本序列之间的实际差异,即增加、删除或改变的部分。difflib中的比较函数的输出可以用来向用户提供更详细的反馈,说明在两个输入中发生变化的地方,以及一个文件随着时间的推移是如何变化的,等等。
1.1 string—Text Constants and Templates (文本常量和模板)
目的 包含用于处理文本的常量和类
1.1.1 Functions
两个函数capwords()和maketrans()
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.
maketrans()函数创建了翻译表,可以与translate()方法一起使用,将一组字符改为另一组,比重复调用replace()更有效率。
import string
leet = string.maketrans(’abegiloprstz’, ’463611092572’)
s = ’The quick brown fox jumped over the lazy dog.’
print s
print s.translate(leet)
在这个例子中,一些字母被其数字所取代。
The quick brown fox jumped over the lazy dog.
Th3 qu1ck 620wn f0x jum93d 0v32 7h3 142y d06.
1.1.2 Templates
字符串模板目的是作为内置插值语法的替代。使用string.Template插值,变量的识别方法是在名称前加
(
例
如
(例如
(例如var),如果需要将其与周围的文本区分开来,也可以用大括号包裹(例如。
${var})。
这个例子将一个简单的模板与一个类似的字符串插值进行比较,使用%运算符。
import string
values = { ’var’:’foo’ }
t = string.Template("""
Variable : $var
Escape : $$
Variable in text: ${var}iable
""")
print ’TEMPLATE:’, t.substitute(values)
s = """
Variable : %(var)s
Escape : %%
Variable in text: %(var)siable
"""
print ’INTERPOLATION:’, s % values
在这两种情况下,触发字符($或%)通过重复两次被转义。
TEMPLATE:
Variable : foo
Escape : $
Variable in text: fooiable
INTERPOLATION:
Variable : foo
Escape : %
Variable in text: 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, err:
print ’ERROR:’, str(err)
print ’safe_substitute():’, t.safe_substitute(values)
由于在数值字典中没有missing的值,substitute()会引发一个KeyError。safe_substitute()没有引发这个错误,并在文本中单独留下了变量表达式。
substitute() : ERROR: ’missing’
safe_substitute(): foo is here but $missing is not provided
1.1.3 Advanced Templates
string.Template的默认语法可以通过调整它用来寻找模板主体中的变量名称的正则表达式模式来改变。一个简单的方法是改变定界符和idpattern类属性。
import string
template_text = ’’’
Delimiter : %%
Replaced : %with_underscore
Ignored : %notunderscored
’’’
d = { ’with_underscore’:’replaced’,
’notunderscored’:’not replaced’,
}
class MyTemplate(string.Template):
delimiter = ’%’
idpattern = ’[a-z]+_[a-z]+’
t = MyTemplate(template_text)
print ’Modified ID pattern:’
print t.safe_substitute(d)
在这个例子中,替换规则发生了变化,分界符是%而不是$,变量名称必须包括下划线。模式%notunderscored没有被任何东西替换,因为它不包括下划线字符。
Modified ID pattern:
Delimiter : %
Replaced : replaced
Ignored : %notunderscored
对于更复杂的变化,可以覆盖pattern属性并定义一个全新的正则表达式。所提供的模式必须包含四个命名组,用于捕捉转义分隔符、命名变量、变量名称的括号版本以及任何无效的分隔符模式。
import string
t = string.Template(’$var’)
print t.pattern.pattern
t.pattern的值是一个编译过的正则表达式,但原始字符串可以通过其pattern属性获得。
\$(?:
(?P<escaped>\$) | # two delimiters
(?P<named>[_a-z][_a-z0-9]*) | # identifier
{(?P<braced>[_a-z][_a-z0-9]*)} | # braced identifier
(?P<invalid>) # ill-formed delimiter exprs
)
这个例子定义了一个新的模式,用它来创建一个新类型的模板。{{var}}作为变量的语法。
import re
import string
class MyTemplate(string.Template):
delimiter = ’{{’
pattern = r’’’
\{\{(?:
(?P<escaped>\{\{)|
(?P<named>[_a-z][_a-z0-9]*)\}\}|
(?P<braced>[_a-z][_a-z0-9]*)\}\}|
(?P<invalid>)
)
’’’
t = MyTemplate(’’’
{{{{
{{var}}
’’’)
print ’MATCHES:’, t.pattern.findall(t.template)
print ’SUBSTITUTED:’, t.safe_substitute(var=’replacement’)
命名模式和括号模式都必须单独提供,尽管它们是一样的。运行示例程序会生成。
MATCHES: [(’{{’, ’’, ’’, ’’), (’’, ’var’, ’’, ’’)]
SUBSTITUTED:
{{
replacement