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

2024-06-02 12:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

一个列表包含格式为“A02A18”的字符串,而下一个列表可能包含与“a2a18”相同的字符串

还有一些字符串可能看起来像“A05”,与“a5”相配

我在标题中说“某些0”,因为如果我从字符串中去掉所有0,我不希望有“A15A20”和“a15a2”这样的字符串匹配(显然,因为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”等字符串


Tags: 方法字符串列表if格式情况firsta5
2条回答

假设您的意思是说除非最后一个字符是零,否则所有的零都应该被忽略,那么下面的代码应该能够执行该任务

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()函数。在这种情况下,它们非常有用

我将使用正则表达式删除字母后面的零,并比较结果(大写源代码,以便能够在不使用大写的情况下进行比较):

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())]

相关问题 更多 >