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

标签 python python-2.7

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

一个列表包含格式为“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。我最初在两边都做了一个 strip 0,以防将来字符串有“a05”而不是“a5”(只是试图覆盖所有基地)

虽然这适用于这种情况,但不适用于诸如“A02A18”和“a2a18”之类的字符串

最佳答案

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

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 而存在误报风险,则转换函数可以创建一个字符串列表 + 转换后的整数作为替代:

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

关于python - 试图在忽略大小写和某些 0 的字符串之间找到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50845431/

相关文章:

python-2.7 - Bokeh 字形坐标 x_axis_type 'datetime'

Python - 两个(略有不同)JSON 数组比较

python - 如何将列表元素转换为百分比

python - 如果没有抛出异常则执行

python - 部分拟合和热启动有什么区别?

Python:功能/方法(如排序)从何而来?

python - 如何从嵌套列表中仅获取前 5 名和后 5 名列表?

python - Jupyter Notebook 中的 %debug - 访问丢失的回溯帧

python - 具有三个特征的 LSTM 训练,但由于输入形状而无法预测

python - Sklearn预测函数