pin_drop当前位置:知识文库 ❯ 图文
Python字符串startswith和endswith方法
概述
str.startswith()和str.endswith()方法用于判断字符串是否以指定的前缀或后缀开头/结尾,返回布尔值。这两个方法在文件类型判断、URL协议检查、数据筛选等场景中非常实用,尤其是支持元组参数可以一次匹配多种模式。本篇教程将详细介绍它们的语法和实际应用。
语法
startswith
str.startswith(prefix[, start[, end]])判断字符串是否以指定前缀开头。
endswith
str.endswith(suffix[, start[, end]])判断字符串是否以指定后缀结尾。
参数说明
基本用法
代码示例
s = "Hello, Python!"
print(s.startswith("Hello"))
print(s.startswith("Python"))
print(s.endswith("!"))
print(s.endswith("Python"))元组参数
startswith()和endswith()的参数可以是元组,只要匹配元组中的任意一个元素就返回True:
代码示例
filename = "report.pdf"
print(filename.endswith((".pdf", ".doc", ".txt")))
url = "https://www.example.com"
print(url.startswith(("http://", "https://", "ftp://")))
image = "photo.png"
print(image.endswith((".jpg", ".png", ".gif", ".bmp")))提示:元组参数是
startswith/endswith最强大的特性,可以替代多个or条件的判断。
对比传统写法
代码示例
filename = "report.pdf"
if filename.endswith(".pdf") or filename.endswith(".doc") or filename.endswith(".txt"):
print("是文档文件")
if filename.endswith((".pdf", ".doc", ".txt")):
print("是文档文件(元组参数)")指定范围
通过start和end参数可以指定检查的范围:
代码示例
s = "Hello, Python!"
print(s.startswith("Python", 7))
print(s.startswith("Python", 0, 6))
print(s.endswith("Python", 0, 13))实际应用
代码示例
path = "/home/user/documents/report.pdf"
print(path.startswith("/", 0))
print(path.startswith("documents", path.find("documents")))实际应用场景
文件类型判断
代码示例
def get_file_type(filename):
if filename.endswith((".jpg", ".jpeg", ".png", ".gif", ".bmp")):
return "图片文件"
elif filename.endswith((".mp3", ".wav", ".flac", ".aac")):
return "音频文件"
elif filename.endswith((".mp4", ".avi", ".mkv", ".mov")):
return "视频文件"
elif filename.endswith((".pdf", ".doc", ".docx", ".txt")):
return "文档文件"
else:
return "其他文件"
files = ["photo.jpg", "music.mp3", "video.mp4", "report.pdf", "data.csv"]
for f in files:
print(f"{f}: {get_file_type(f)}")URL协议检查
代码示例
def check_url(url):
if url.startswith("https://"):
return "安全连接(HTTPS)"
elif url.startswith("http://"):
return "普通连接(HTTP)"
elif url.startswith("ftp://"):
return "文件传输(FTP)"
elif url.startswith(("mailto:", "tel:")):
return "特殊协议"
else:
return "未知协议"
urls = [
"https://www.example.com",
"http://example.com",
"ftp://files.example.com",
"mailto:test@example.com",
]
for url in urls:
print(f"{url}: {check_url(url)}")数据筛选
代码示例
contacts = [
"张三-13812345678",
"李四-15987654321",
"王五-01012345678",
"赵六-02198765432",
]
mobile = [c for c in contacts if c.split("-")[1].startswith(("13", "15", "17", "18", "19"))]
landline = [c for c in contacts if c.split("-")[1].startswith(("01", "02"))]
print(f"手机号: {mobile}")
print(f"座机号: {landline}")日志过滤
代码示例
logs = [
"[ERROR] Database connection failed",
"[WARN] Memory usage high",
"[INFO] User logged in",
"[ERROR] File not found",
"[INFO] Task completed",
]
errors = [log for log in logs if log.startswith("[ERROR]")]
print(f"错误日志: {errors}")代码示例
综合运用startswith和endswith方法:
代码示例
files = [
"report.pdf",
"photo.jpg",
"data.csv",
"script.py",
"config.json",
"style.css",
"index.html",
]
code_files = [f for f in files if f.endswith((".py", ".js", ".html", ".css", ".json"))]
print(f"代码文件: {code_files}")
image_files = [f for f in files if f.endswith((".jpg", ".png", ".gif"))]
print(f"图片文件: {image_files}")
env_vars = [
"PATH=/usr/bin",
"HOME=/home/user",
"PYTHONPATH=/opt/python",
"JAVA_HOME=/opt/java",
"USER=admin",
]
python_vars = [v for v in env_vars if v.startswith("PYTHON")]
print(f"Python相关环境变量: {python_vars}")
sentence = "The quick brown fox jumps over the lazy dog"
vowel_words = [w for w in sentence.split() if w.lower().startswith(("a", "e", "i", "o", "u"))]
print(f"元音开头的单词: {vowel_words}")注意事项
1.
startswith()和endswith()返回布尔值,不是索引2. 元组参数非常实用,但列表或集合不能作为参数,必须是元组
3. 空字符串的前缀/后缀检查始终返回
True4.
start和end参数遵循切片的"左闭右开"原则5. 这两个方法区分大小写,如需不区分大小写,先转换为统一大小写
6. 检查单个字符时,也可以用
in操作符配合索引,但startswith/endswith更直观
小结
本篇教程详细介绍了str.startswith()和str.endswith()方法的用法,包括基本用法、元组参数、指定范围检查以及文件类型判断、URL检查、数据筛选等实际应用场景。元组参数是这两个方法最强大的特性,可以简洁地实现多模式匹配,替代繁琐的or条件判断。
练习题
练习1
给定一个文件名列表 ["report.pdf", "photo.jpg", "data.csv", "script.py", "music.mp3"],请使用endswith()方法将文件分为"文档"(.pdf, .doc, .txt, .csv)和"媒体"(.jpg, .png, .mp3, .mp4)两类。
练习2
编写一个函数,接收一个URL字符串,判断它是否是有效的Web地址(以http://或https://开头,且以.com、.org、.net或.cn结尾)。
常见问题
startswith()和endswith()返回值是什么类型?
返回布尔值(True或False),不是索引。如果需要查找子串位置,应使用find()方法。
元组参数可以用列表或集合替代吗?
不可以。startswith和endswith只接受字符串或元组作为参数,列表和集合会导致TypeError。如需使用列表,需先用tuple()转换为元组。
如何进行不区分大小写的前缀/后缀判断?
可以先将字符串统一转为小写或大写,如s.lower().startswith("hello")或s.upper().endswith(".PDF")。
空字符串作为参数会返回什么?
空字符串的前缀/后缀检查始终返回True,因为任何字符串都以空字符串开头和结尾。
start和end参数的范围规则是什么?
遵循切片的"左闭右开"原则,即包含start位置,不包含end位置。例如s.startswith("Py", 0, 2)只检查前两个字符。
小贴士
在处理文件扩展名或URL协议时,强烈建议使用元组参数替代多个or判断。元组参数不仅代码更简洁,而且性能更好。例如:filename.endswith((".jpg", ".png", ".gif")) 比连续三个or判断要优雅得多。
本文涉及AI创作
内容由AI创作,请仔细甄别