当前位置:网站首页>《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
边栏推荐
- 函数计算进阶-IP查询工具开发
- 表单验证,为避免全局污染,少定义全局变量写法
- The kth smallest node in the print binary search tree of offer
- sql 筛选查询重复列
- Mongodb kernel source code implementation, performance tuning, best operation and maintenance practice series command processing module source code implementation 1
- 利用尾巴作为时间序列进行处理来识别鲸鱼
- Python调用飞书发送消息
- The problem of looting by leetcode
- CUDA_主机内存
- Must see! RDS database all in one
猜你喜欢

Validation failed for one or more entities. See 'entityvalidationerrors' solution

How to greatly improve the performance of larravel framework under php7? Install stone!

Apache Hadoop的重要组成

JT Jingtao project

PL/SQL Developer临时用户和新手的功能指南

爱康国宾怒斥国信证券报告失实,已发律师函

CRM系统能帮助企业做哪些事?

ES6, ES7, es8 Learning Guide

Prometheus installation configuration

害怕重构?都怪我太晚和你介绍该如何重构,现在我来了
随机推荐
Common concepts and points for attention of CUDA
自己上手写性能测试工具(二)
接缝雕刻算法:一种看似不可能的图像大小调整方法
利用尾巴作为时间序列进行处理来识别鲸鱼
C/C++编程日记:逻辑井字棋(圈叉)游戏开发
Error running app:Default Activity not found 解决方法
IP address SSL certificate
crm系统的成本一般是多少?
PL/SQL Developer临时用户和新手的功能指南
CUDA_ Shared memory, memory access mechanism, access optimization
【CentOS7操作系统安全加固系列】第(2)篇
Guest interview: Wang Jian
利用尾巴作为时间序列进行处理来识别鲸鱼
Operation and design of rights management in ERP
asp.net Using serilog in core and customizing enrich
ES6、ES7、ES8学习指南
算法模板整理(一)
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
CUDA_全局内存及访问优化
IP地址SSL证书