试图找到忽略大小写的字符串之间的匹配以及某些0

时间:2018-06-13 20:08:16

标签: python python-2.7

有两个字符串列表,我试图找到它们之间的匹配。它们都包含具有不同格式的字符串,但它们指向相同的信息列表。

一个列表包括格式为" A02A18"而下一个字符串可以与" a2a18"

具有相同的字符串

还有一些字符串看起来像" A05"这将与" a5"

一起使用

我说"某些0"在标题中,因为我不希望有一个字符串,如" A15A20"和" a15a2"匹配,如果我从字符串中删除所有0(显然因为05与5相同,但20与2不同)

我正在寻找一种可以让它们在找到后相互匹配的方法。

理想情况下看起来像

first = "A02A18"
second = "a2a18"

if first == second:
  print "Yes"

我有什么 -

最初,我有一个声明符合" A05"和" a5" 这看起来像

first = "A05"
second = "a5"

if first[1:].lstrip("0") == second[1:].lstrip("0"):
  print "yeah"

这将采用两个字符串并在第一个索引之后对它们进行比较,因此在上一个示例的情况下" A05"并且在第一个字母之后比较a5以忽略该情况。然后lstrip" 0"会剥掉那里的0。我最初在双方做了一个带0,以后将来一个字符串" a05"而不是" a5" (只是试图涵盖所有基地)

虽然这适用于这种情况,但它不适用于诸如" A02A18"和" a2a18"

2 个答案:

答案 0 :(得分:2)

我会使用正则表达式来删除一个字母后面的零,并比较结果(大写来源可以比较没有套管):

import re

def compare(s1,s2):
    def convert(s):
        return re.sub("([A-Z])0+",r"\1",s.upper())
    return convert(s1) == convert(s2)


print(compare("A02A18","a2a18"))
print(compare("A20A18","a2a18"))

结果:

True
False

注意:这也适用于A000B12:只删除了零。但是,如果由于输入可以是A00B1AB1而存在误报风险,则convert函数可以创建字符串列表+转换后的整数作为替代:

def convert(s):
    return [int(x) if x.isdigit() else x.upper() for x in re.findall("[a-zA-Z]+|\d+",s)]

或更简单的版本从一开始就大写来源(更短,可能稍微快一点,因为只有一次调用upper

def convert(s):
    return [int(x) if x.isdigit() else x for x in re.findall("[A-Z]+|\d+",s.upper())]

答案 1 :(得分:-1)

假设您的意思是除非最后一个字符为零,否则应该忽略所有零,以下代码应该能够执行该任务。

def main(first, second):

first = first.lower()
second = second.lower()

string = ""

for i in range(0, (len(first)-1)):
    if(first[i] != "0"):
        string = string + first[i]

string = string + first[-1]

if(string == second):
    return True
else:
    return False


answer = main("A02A18", "a2a18")
print(answer)

answer = main("A15A20", "a15a2")
print(answer)

此代码在第一次调用时返回True,在第二次调用时返回False。将来,请记住string.lower()string.upper()函数。它们在这种情况下非常有用。