【问题标题】:Simple way to handle letter and number combination处理字母和数字组合的简单方法
【发布时间】:2020-04-18 15:56:13
【问题描述】:

假设我有两个字符串:

string_ex1 = 'AbC024'
string_ex2 = 'aBc24'

string_ex3 = 'AbC24'
string_ex4 = 'aBc24'

如果我相互比较,我想要两个字符串相等的结果。 例如'AbC' == 'aBc', '024' == '24'

我已经知道如果我用 \w+ 和 \d+ 区分它们并分别转换为小写和 int,我可以得到一个结果说两个字符串是相同的。但我想知道是否有一些更简单的功能可以做到这一点。

string1_str = lower(re.findall('\w+', string_ex1))
string1_int = int(re.findall('\d+', string_ex1))
string2_str = lower(re.findall('\w+', string_ex2))
string2_int = int(re.findall('\d+', string_ex2))

if string1_str == string2_str and string1_int == string2_int:
    print('identical')

*编辑 比较应该适用于 string_ex1、string_ex2 和 string_ex3、string_ex4

【问题讨论】:

  • 那么,更准确地说,您想忽略大小写和前导零?
  • 你能分享一下你现在用来完成任务的代码吗?这将使定义“更简单”更容易:-)
  • @DeepSpace 是的。正是
  • 当您回复要求澄清的评论时,通常最好编辑您的问题,而不是在 cmets 中详细说明。问题应该是独立的,部分原因是并非所有读者都阅读所有 cmets。考虑将标题更改为“忽略大小写和前导零时比较两个字符串”。
  • 一种方法是使用正则表达式(?<=\D)(?=\d) 将每个字符串分成两部分。例如,ABC012abc12 将分别拆分为 ["ABC", "012"]["abc", "12"]。然后分别比较"ABC""abc" 大小写,并将"012""12" 转换为整数后比较1212

标签: python regex python-re


【解决方案1】:

您可以使用删除前导零的正则表达式,然后使用casefold 比较:

import re

string_ex1 = 'AbC024'
string_ex2 = 'aBc24'

string_ex1 = re.sub(r'(?<=\D)0+(?=\d)', '', string_ex1)
string_ex2 = re.sub(r'(?<=\D)0+(?=\d)', '', string_ex2)

print(string_ex1.casefold() == string_ex2.casefold())
# True

或者,您可以在调用re.sub 时同时在两个字符串上调用lower

import re

string_ex1 = 'AbC024'
string_ex2 = 'aBc24'

string_ex1 = re.sub(r'(?<=\D)0+(?=\d)', '', string_ex1.lower())
string_ex2 = re.sub(r'(?<=\D)0+(?=\d)', '', string_ex2.lower())

print(string_ex1 == string_ex2)

【讨论】:

    【解决方案2】:

    没有内置的方法可以做到这一点。我建议你找到两个字符串的组:只有字母,或者只有数字,并以小写形式比较它们,不带前导零

    def test(str1, str2):
        values1 = re.findall("([a-z]+|[0-9]+)", str1, flags=re.I)
        values2 = re.findall("([a-z]+|[0-9]+)", str2, flags=re.I)
        clean = lambda x: x.lower().lstrip("0")
        return all(a == b for a, b in zip(map(clean, values1), map(clean, values2)))
    
    print(test('AbC024', 'aBc24'))  # True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多