【Python Cookbook】S02E02 在字符串的开头或者结尾处做文本匹配

问题

如果我们需要在字符串的开头或者结尾处按照指定的文本模式做检查,例如检查文件的扩展名,URL协议类型等等。

解决方案

检查如扩展名等结尾的文本模式,选择 str.startswith() 方法,检查如URL协议类型等开头的文本模式,选择 str.endswith() 方法。

file_name = "spam.txt"
print(file_name.endswith(".txt"))

url = "http://www.python.org"
print(url.startswith("http:"))

结果:

True
True

如果需要匹配多个文本模式,则只需在 startswith() 方法和 endswith() 方法中提供包含所有可能的元组参数即可。

filenames = ['Makefile', 'foo.c', 'bar.py', 'spam.c', 'spam.h']
print([name for name in filenames if name.endswith(('.c', '.h'))])
print(any(name.endswith('.py') for name in filenames))

结果:

['foo.c', 'spam.c', 'spam.h']
True

需要注意的是,函数 startswith()endswith() 中,若需要匹配多个文本模式,其参数必须为元组而非列表等。

print([name for name in filenames if name.endswith(['.c', '.h'])])
# 输出错误信息
>>> TypeError: endswith first arg must be str or a tuple of str, not list

讨论

虽然为了前缀与后缀内容,我们有很多方法:

# 切片法
print([filename[-2:] == '.c' for filename in filenames])
# 正则表达式法
import re
url = "http://www.python.org"
print(re.match('http:|https:|ftp:', url))

切片法不够优雅,有局限性,正则表达式法又有些过于重量级。使用本节内容中的两个函数相对来说更加简单,且运行更快。更重要的是,其可以与生成器表达式等结合在一起,实现更多效果功能。

相关推荐

  1. 05- 还双引号添加字符串?- 文本

    2024-06-09 06:52:02       18 阅读
  2. 01-XML-02XML DTD定义文档结构

    2024-06-09 06:52:02       15 阅读
  3. <span style='color:red;'>01</span>-<span style='color:red;'>02</span>

    01-02

    2024-06-09 06:52:02      40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 06:52:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 06:52:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 06:52:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 06:52:02       18 阅读

热门阅读

  1. python打印一颗桃花树

    2024-06-09 06:52:02       12 阅读
  2. 【深度学习基础】模型文件介绍

    2024-06-09 06:52:02       9 阅读
  3. 用旧安卓手机当 linux 开发机

    2024-06-09 06:52:02       13 阅读
  4. LeetCode题练习与总结:三角形最小路径和--120

    2024-06-09 06:52:02       9 阅读
  5. Sony前端连接功放:深度解析与实用指南

    2024-06-09 06:52:02       12 阅读