字符串开头或结尾匹配

问题

你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀, URL
Scheme 等等。

解法

检查字符串开头或结尾的一个简单方法是使用 str.startswith() 或者是str.endswith() 方法。比如:

>>> filename = 'spam.txt'
>>> filename.endswith('.txt')
True
>>> filename.startswith('file:')
False
>>> url = 'http://www.python.org'
>>> url.startswith('http:')
True
>>>

如果你想检查多种匹配可能,只需要将所有的匹配项放入到一个元组中去,然后传给 startswith() 或者 endswith() 方法:

>>> import os
>>> filenames = os.listdir('.')
>>> filenames
[ 'Makefile', 'foo.c', 'bar.py', 'spam.c', 'spam.h' ]
>>> [name for name in filenames if name.endswith(('.c', '.h')) ]
['foo.c', 'spam.c', 'spam.h'
>>> any(name.endswith('.py') for name in filenames)
True
>>>

另一个例子

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()

奇怪的是,这个方法中必须要输入一个元组作为参数。如果你恰巧有一个 list 或者 set 类型的选择项,要确保传递参数前先调用 tuple() 将其转换为元组类型。比如:

>>> choices = ['http:', 'ftp:']
>>> url = 'http://www.python.org'
>>> url.startswith(choices)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: startswith first arg must be str or a tuple of str, not list
>>> url.startswith(tuple(choices))
True
>>>

讨论

startswith() 和 endswith() 方法提供了一个非常方便的方式去做字符串开头和结尾的检查。类似的操作也可以使用切片来实现,但是代码看起来没有那么优雅。比如:

>>> filename = 'spam.txt'
>>> filename[-4:] == '.txt'
True
>>> url = 'http://www.python.org'
>>> url[:5] == 'http:' or url[:6] == 'https:' or url[:4] == 'ftp:'
True
>>>

你可以能还想使用正则表达式去实现,比如:

>>> import re
>>> url = 'http://www.python.org'
>>> re.match('http:jhttps:jftp:', url)
<_sre.SRE_Match object at 0x101253098>
>>>

这种方式也行,但是对于简单的匹配实在是有点杀鸡用牛刀了,本节中的方法更加简洁。

最后提一下,当和其他操作比如普通数据聚合相结合的时候 startswith() 和 endswith() 方法是很不错的。比如,下面这个语句检查某个文件夹中是否存在指定的文件类型:

if any(name.endswith(('.c', '.h')) for name in listdir(dirname)):
...

《Python Cookbook 3rd》笔记(2.2):字符串开头或结尾匹配相关推荐

  1. Python实战从入门到精通第七讲——字符串与文本1之字符串开头或结尾匹配

    通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等. 检查字符串开头或结尾的一个简单方法是使用 str.startswith() 或者是 str.endswith( ...

  2. python cookbook 读书笔记2(字符串处理2)

    1.8检查字符集中是否包含某字符集中的字符,在以下几个例子中,也就是检查seq是否包含aset中的项,各函数中Any结尾是部分包含,也就是只要有其中元素就返回true,All结尾的是全部包含,必须包含 ...

  3. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Python Cookbook学习笔记ch2_01

    第二章,也可以去这里查看笔记噢虫洞在这里 2.1使用多个界定符分隔字符串 问题:将一个字符串分隔为多个字段,但是分隔符并不是固定的 方案:string对象的split() 只适用于简单的字符串分隔,他 ...

  6. 《Python Cookbook 3rd》笔记(2.11):删除字符串中不需要的字符

    删除字符串中不需要的字符 问题 你想去掉文本字符串开头,结尾或者中间不想要的字符,比如空白 解法 strip() 方法能用于删除开始或结尾的字符. lstrip() 和 rstrip() 分别从左和从 ...

  7. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  8. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  9. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

最新文章

  1. 美国五大科技巨头的人工智能竞赛
  2. Sublime Text3软件安装教程
  3. WebMagic之爬虫监控
  4. 吉林高考成绩查询2021年几号公布,2021年吉林高考成绩查询时间及查分方式
  5. php接口返回一个数组怎末写_php api返回json数组
  6. 复杂的c语言,C语言:复杂数据类型
  7. python为什么import不了_python – 为什么PyImport_Import无法从当前目录加载模块?
  8. (转)初识suse——linux
  9. Mybatis中insert之后返回主键
  10. 坐标求四面体体积_解析几何课程中求四面体体积新方法探究
  11. 2014年9月-前端开发月刊
  12. 计算机学院教学质量改进的制度,计算机科学与技术学院教学管理文件规章制度汇编.doc...
  13. 记用Fiddler抓包爬取pc端微信公众号文章
  14. xdoc html导出word,使用XDocReport将HTML格式数据转换为Word
  15. 永不服输的Java之路---重学Java (第一章)
  16. 洛谷_3975 [TJOI2015]弦论(后缀自动机)
  17. windows下内存检测工具
  18. 企业创新系列之:天地不仁
  19. 打领带的方法,心学!
  20. 在Docker容器中运行程序时出错,You have to remove (or rename) that container to be able to reuse that name

热门文章

  1. linux屏保配置文件夹,Linux下屏保设置
  2. 【转】1.A(译).NET4.X 并行任务中Task.Start()的FAQ
  3. 【转】掌握Azure订阅的关键概念和术语
  4. 01-单一职责原则(SPR)
  5. ASP.NET MVC 入门5、View与ViewData
  6. 第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions
  7. 用java查询excel表格_如何把java查询出的内容导入到excel表格
  8. linux octave源码安装,在Linux操作系统上安装Octave的方法
  9. 【编译原理】词法分析程序设计
  10. 隐藏wp login.php,Wordpress 隐藏登陆链接