有两个字符串列表,我试图找到它们之间的匹配。它们都包含具有不同格式的字符串,但它们指向相同的信息列表。
一个列表包括格式为" 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"
答案 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
:只删除了零。但是,如果由于输入可以是A00B1
和AB1
而存在误报风险,则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()
函数。它们在这种情况下非常有用。