针对任意多的分隔符拆分字符串
无论是解析数据还是产生输出,几乎每一个有实用价值的程序都会涉及某种形式的文本处理。假如我们需要将字符串拆分为不同的字段
但是分隔符以及分隔符之间的空格在整个字符串中并不一致。对于这种情况,我们可以用字符串对象的re.split()方法来解决。举个例子:
>>> line = 'asdf fghj,asdf, foo'
>>> import re
>>> re.spilt(r'[:, \s]\s*', line)
['asdf', 'fghj', 'asdf', 'foo']
re.spilt()这玩意可以为分隔符指定多个模式。分隔符可以是逗号,分号或者是空格符。只要找到对应模式,无论对应点两端是什么字段,整个匹配结果都是那个分配符,最终的结果就是字段列表,就如同str.spilt()得到的结果一样
在字符串的开头或者结尾做文本匹配
有时候我们需要在字符串的开头或者结尾处按照指定的文本模式进行检查。这个时候,我们就可以调用str.startswith()和str.endswith()就可以了
>>> filename = '1.txt'
>>> filename.endswith('.txt')
True
>>> filename.startswith('file:')
False
>>> url = 'http://www.python.org'
>>> url.startswith('http')
True
如果需要同时针对多个选项进行检查,我们就只需要给startswith()和endswith()提供包含可能选项的元组就好,比如说就像这样:
from urllib.request import urlopen
def read_data(name):
if name.startswith(('http', 'https', 'ftp:')):
return urlopen(name) .read()
else:
with open(name) as f:
return f.read()
有意思的是,Python需要把元组当成输入的一个地方,如果我们刚好把选项指定在列表或者集合中的时候,请确保首先用tuple()将它们转换为元组
利用shell通配符做字符串匹配
当开发环境在Unix环境下的时候,我们就可以用fnmatch模块的fnmatch()和fnmatchcase()这两个函数来做文本批评人
#导入函数
>>> from fnmatch import fnmatch, fnmatchcase
#调用
>>> fnmatch('foo.txt', '*.txt')
True
注意:fnmatch的匹配模式所采用的大小写区分规则和底层文件系统相同,也就是说在macOS和Windows下的输出是不同的。如果这个区分很重要的话,我们就应该使用fnmatchcase()函数而不是fnmatch()函数。
fnmatch所完成的匹配操作有点介乎于简单字符串方法和全功能正则表达式之间。如果实际上是想编辑匹配文件名的代码,那就应该使用glob模块来完成
参考书目:
《Python CookBook》作者:【美】 David Beazley, Brian K. Jones
Github地址:yidao620c/python3-cookbookgithub.com