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

​ 这种方式也行的通,但是对于简单的匹配实际有点大材小用了,本节中的方法更加简单并且运行会更加快一些。

posted @ 2022-02-17 18:03  qiupeng  阅读(74)  评论(0)    收藏  举报