前言:
目前你们对“正则表达式匹配字符串开头结尾”都比较关心,咱们都想要剖析一些“正则表达式匹配字符串开头结尾”的相关文章。那么小编在网上收集了一些关于“正则表达式匹配字符串开头结尾””的相关资讯,希望朋友们能喜欢,兄弟们快快来学习一下吧!学习《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()相同,这里也就不再赘述
标签: #正则表达式匹配字符串开头结尾