龙空技术网

字符串开头或结尾匹配

申浩黄粱 84

前言:

目前你们对“正则表达式匹配字符串开头结尾”都比较关心,咱们都想要剖析一些“正则表达式匹配字符串开头结尾”的相关文章。那么小编在网上收集了一些关于“正则表达式匹配字符串开头结尾””的相关资讯,希望朋友们能喜欢,兄弟们快快来学习一下吧!

学习《Python Cookbook》第三版

你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀, URL Scheme 等等。

检查字符串开头或结尾的一个简单方法是使用str.startswith()或者是str.endswith()方法。比如:

filename = 'dog.xlsx'url = ';print(filename.startswith('dog'))	# Trueprint(filename.endswith('xlsx'))	# Trueprint(url.startswith('https:'))	# Trueprint(url.endswith('/'))	# True

如果你想检查多种匹配可能,只需要将所有的匹配项放入到一个元组中去,然后传给 startswith() 或者 endswith() 方法:

import osfilenames = os.listdir('../data')print(filenames)	# ['data.txt', 'pets.csv']print(name for name in filenames if name.startswith('pets'))		# <generator object <genexpr> at 0x000001E167BCA4F8>print([name for name in filenames if name.startswith(('pets', 'data'))])	# ['pets.csv', 'data.txt']print(any(name for name in filenames if name.endswith('csv')))	# True

下面是另一个例子,根据名称前缀,处理数据

from urllib.request import urlopendef read_data(name):    if name.startswith(('http:', 'https:', 'ftp:')):        return urlopen(name).read()    else:        with open(name) as f_obj:            return f_obj.read()data = ';data_file = 'py20210126.py'print(read_data(data))	# 读取URL数据print(read_data(data_file))	# 读取文件数据,首先保证文件存在,否则会报FileNotFoundError

奇怪的是,这个方法中必须要输入一个元组作为参数。如果你恰巧有一个 list 或者 set 类型的选择项,要确保传递参数前先调用 tuple() 将其转换为元组类型。比如

filename = 'dog.xlsx'url = ';choices = ['http:', 'https:']# url.startswith(choices)	# 报错 TypeError   startswith first arg must be str or a tuple of str, not listprint(url.startswith(tuple(choices)))	# True

startswith() 和 endswith() 方法提供了一个非常方便的方式去做字符串开头和结尾的检查。类似的操作也可以使用切片来实现,但是代码看起来没有那么优雅。比如:

filename = 'dog.xlsx'url = ';print(filename[slice(None, 3)])	# dogprint(filename[:3])	# dogprint(filename[:3] == 'dog') # Trueprint(url[slice(-1, None)])	# /print(url[-1:])	# /print(url[-1:] == '/')	# True

你可能还想使用正则表达式去实现,比如:

import refilename = 'dog.xlsx'url = ';print(re.match(r'(https:|http:|ftp:)', url))	# <re.Match object; span=(0, 6), match='https:'>

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

最后提一下,当和其他操作比如普通数据聚合相结合的时候 startswith() 和endswith() 方法是很不错的。比如,下面这个语句检查某个文件夹中是否存在指定的文件类型:

if any(name.endswith(('.xlsx', '.py')) for name in listdir(dirname)):    print('God')

官方给的解释:

str.startswith(prefix[, start[, end]])

Return True if string starts with the prefix, otherwise return False. prefix can also be a tuple of prefixes to look for. With optional start, test string beginning at that position. With optional end, stop comparing string at that position.

如果字符串以prefix开头则返回True,否则返回False。prefix也可以是要查找的前缀的元组。使用可选的start,字符串从该位置开始匹配。使用可选的end,在该位置之前比较字符串。

print(url.startswith('https:', 0, 6))	# True

str.endswith()与startswith()相同,这里也就不再赘述

标签: #正则表达式匹配字符串开头结尾