2.2字符串开头或者结尾匹配
问题
你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等。
解决方案
检查字符串开头或结尾的一个简单方法是使用str.startswith()或者是str.endswith()方法。比如:
filename='spam.txt'
print(filename.endswith('.txt')) #->True
print(filename.startswith('file:')) #->False
url='https://www.baidu.com/'
print(url.startswith('https:')) #->True
如果你想检查多种匹配可能,只需要将所有的匹配项放入一个元组中去,然后传递给str.startswith()或者str.endswith()方法:
import os
filename = os.listdir(".")
print(filename) # ->['2-1使用多个界定符分隔字符串.py', '2-2字符串开头或者结尾匹配.py']
print([name for name in filename if name.endswith(('c', '.h', '.py'))])
# ->['2-1使用多个界定符分隔字符串.py', '2-2字符串开头或者结尾匹配.py']
print(any(name.endswith('py') for name in filename)) # ->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=['https:','http:']
url='https:www.baidu.com'
print(url.startswith(choices)) # ->TypeError: startswith first arg must be str or a tuple of str, not list
讨论
str.startswith()和str.endswith()方法提供了一个非常方便的方式去做字符串开头和结尾的检查。类似的操作也可以使用切片来实现,但是代码看起来没有那么优雅。比如:
url='https:www.baidu.com'
filename = 'spam.txt'
print(filename[-4:]=='.txt') # -> True
print(url[:5]=='https:' or url[:4]=='http:' or url[:4]=='ftp:') # False
你也也可以想使用正则表达式去实现,比如:
url='https:www.baidu.com'
import re
print(re.match('http:|https:|ftp:',url))
这种方式也行的通,但是对于简单的匹配实际有点大材小用了,本节中的方法更加简单并且运行会更加快一些。

浙公网安备 33010602011771号