搜索不区分大小写的字符串

时间:2016-01-06 15:19:40

标签: python string case-sensitive

#define reader and process header
csvReader = csv.reader(tmpfile)
header = next(csvReader)
template_name_index = header.index('TemplateName')

我希望程序解析文件并查找标题' TemplateName'但我希望它能够找到标题,即使它的大写或小写。

1 个答案:

答案 0 :(得分:1)

由于您要在字符串数组中查找字符串,因此可能需要遍历每个字符串。例如,这会在进行比较之前将字符串转换为小写:

indexes = [index for index, name in enumerate(header) if name.lower() == "templatename"]
if len(indexes) == 1:
    index = indexes[0]            
    # There is at least one header matching "TemplateName"
    # and index now points to the first header.

请注意,if语句认为可能没有标题或多个标题与给定名称匹配。为了您的保证,请注意lower()不会更改原始字符串的大小写。

您可能还会发现在调用index之前将标题中的所有字符串转换为小写更为明显,这看起来更像您的原始代码:

try:
    index = [name.lower() for name in header].index("templatename")
except ValueError:
    # There is no header matching "TemplateName"
    # and you can use `pass` to just ignore the error.
else:
    # There is at least one header matching "TemplateName"
    # and index now points to the first header.

请注意,与之前一样,lower()不会更改实际标头的大小写,因为它只在循环的上下文中完成。实际上,Python中的字符串是不可变的,因此您无法在适当的位置更改它们。

您也可以考虑使用正则表达式。例如,这将搜索case insensitve而不将字符串转换为小写:

import re
indexes = [index for index, name in enumerate(header) if re.match(name, "TemplateName", re.I)]

请注意,如果您真的不需要索引,那么您可以移除enumerate并简化循环。