如何在Python中匹配字符串开头或结尾的文本?

问题..

假设您需要检查特定文本模式的字符串开头或结尾。通用模式可能是文件扩展名,但也可以是任何东西。我将向您展示几种方法。

Startswith()方法

一种检查字符串开头的简单方法是使用startswith()方法。

示例

text = "Is USA colder than Australia?"
print(f"output \n {text.startswith('Is')}")

输出结果

True

示例

filename = "Hello_world.txt"
print(f"output \n {filename.startswith('Hello')}")

输出结果

True

示例

site_url = 'https://www.something.com'
print(f"output \n {site_url.startswith('http:')}")

输出结果

False

示例

print(f"output \n {site_url.startswith('https:')}")

输出结果

True

endswith()方法。

一种检查字符串结尾的简单方法是使用endswith()方法。

输出结果

text = "Is USA colder than Australia?"
print(f"output \n {text.endswith('?')}")

输出结果

True

示例

filename = "Hello_world.txt"
print(f"output \n {filename.endswith('.txt')}")

输出结果

True

现在,如果要使用上述方法检查多个选择,则需要提供元组。一种常见用法是检查文件扩展名,让我们说我们需要验证目录中的“ .txt”和“ .csv”文件。

import os
filenames = os.listdir('.')
# Let us first check if there are files
print(f"output \n {any(name.endswith(('.csv',',txt')) for name in filenames)}")

输出结果

True

输出结果

[name for name in filenames if name.endswith(('.csv', '.txt')) ]

输出结果

['file1.csv',
'HRDataset.csv',
'Input.csv',
'input.txt',
'input_copy.txt',
'movies_data.csv',
'my_html_data_to_csv.csv',
'temporary_file1_for_zip.csv',
'temporary_file2_for_zip.csv',
'test.csv',
'test1.txt',
'test2.txt',
'tmdb_5000_movies.csv']

请记住,这些方法接受元组,如果您要搜索的选项列表,那么我们需要将它们转换为元组。

import os

# list with choices
patters = ['.csv','.txt']

# get the file names
filenames = os.listdir('.')

# Let us first check if there are files
any(name.endswith(patters) for name in filenames)

输出结果

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
8
9 # Let us first check if there are files
---> 10 any(name.endswith(patters) for name in filenames)

in (.0)
8
9 # Let us first check if there are files
---> 10 any(name.endswith(patters) for name in filenames)

TypeError: endswith first arg must be str or a tuple of str, not list

上面的命令返回了一个错误,因此我们需要将列表转换成元组。

示例

# Let us first check if there are files
any(name.endswith(tuple(patters)) for name in filenames)

输出结果

True

同样,我们需要将list转换为元组以获取文件名。

示例

[name for name in filenames if name.endswith(tuple(patters)) ]

输出结果

['file1.csv',
'HRDataset.csv',
'Input.csv',
'input.txt',
'input_copy.txt',
'movies_data.csv',
'my_html_data_to_csv.csv',
'temporary_file1_for_zip.csv',
'temporary_file2_for_zip.csv',
'test.csv',
'test1.txt',
'test2.txt',
'tmdb_5000_movies.csv']

最后,startswith()endswith()方法与其他操作(例如通用数据缩减)结合使用时看起来不错。例如:

示例

if any(name.endswith(tuple(patters)) for name in filenames):
<perform the logic here>