当前位置:网站首页>《Python Cookbook 3rd》笔记(2.2):字符串开头或结尾匹配
《Python Cookbook 3rd》笔记(2.2):字符串开头或结尾匹配
2020-11-09 23:53:00 【巨輪】
字符串开头或结尾匹配
问题
你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀, 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)):
...
版权声明
本文为[巨輪]所创,转载请带上原文链接,感谢
https://my.oschina.net/jallenkwong/blog/4710364
边栏推荐
- ES6、ES7、ES8学习指南
- 获取List集合对象中某一列属性值
- ES6, ES7, es8 Learning Guide
- Nodejs: handwritten koa Middleware
- 害怕重构?都怪我太晚和你介绍该如何重构,现在我来了
- 那么当下的行情投资者该怎么办呢? 现在新的投资风口来了!
- SSL证书和公网IP地址如何影响SEO
- What can CRM system help enterprises do?
- 会展云技术解读 | 面对突发事故,APP 如何做好崩溃分析与性能监控?
- C / C + + Programming Notes: C language development tank war! In memory of our lost little overlord game
猜你喜欢
随机推荐
Mongodb kernel source code implementation, performance tuning, best operation and maintenance practice series command processing module source code implementation 1
一幅图像能顶16x16字!——用于大规模图像缩放识别的变压器(对ICLR 2021年论文的简要回顾)
Software engineering in code -- source code analysis of menu project
PLSQL Developer常用设置
【LeetCode】 92 整数反转
Unity使用transform.Rotate进行三维旋转角度出现偏差
Algorithm template arrangement (1)
自己上手写性能测试工具(二)
No space left on device
C / C + + Programming Notes: C language development tank war! In memory of our lost little overlord game
Python调用飞书发送消息
DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
Functional guide for temporary users and novices of PL / SQL developer
What is the SRM system? SRM supplier management system functions
How much is the cost of CRM system?
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
C/C++编程笔记:C语言开发坦克大战!纪念我们逝去的小霸王游戏
LinkedList源码简析
CUDA_ Global memory and access optimization
获取List集合对象中某一列属性值





