如何在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>