Python 处理字母和数字组合的简单方法

Python 处理字母和数字组合的简单方法,python,regex,re,Python,Regex,Re,假设我有两个字符串: string_ex1 = 'AbC024' string_ex2 = 'aBc24' string_ex3 = 'AbC24' string_ex4 = 'aBc24' 我想要一个结果,如果我互相比较,两个字符串是相等的。 例如“AbC”==“AbC”,“024”==“24” 我已经知道,如果我用\w+和\d+区分它们,并分别转换为小写和int,我可以得到一个结果,表明两个字符串是相同的。但我想知道是否有更简单的函数来实现它 string1_str = lower(re

假设我有两个字符串:

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,没有内置的方法。我建议,对于这两个字符串,您都可以找到组:只有字母,或者只有数字,并以小写形式比较它们,并且不带前导零

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

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

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

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

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

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

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

所以,更准确地说,你想忽略大小写和前导零吗?你能分享你现在用来完成任务的代码吗?这将更容易定义“更简单”:-@DeepSpace是的。确切地说,当你回复要求澄清的评论时,通常最好是编辑你的问题,而不是在评论中详细说明。问题应该是独立的,部分原因是并非所有读者都阅读所有评论。考虑将标题改为“忽略两个字符串,忽略实例和前导零”。一种方法是用正则表达式<代码>将每个字符串分割成两部分。(?那么,更准确地说,您想忽略大小写和前导零吗?您能否共享您现在用于执行任务的代码?这将使定义“simpler”(更简单)变得更容易:-)《深邃的空间》是的。很显然,当你回复一个要求澄清的评论时,最好是编辑你的问题而不是在评论中详细阐述。问题应该是自包含的,部分原因是不是所有的读者都读到所有的评论。考虑改变你的标题,“在忽略案例和前导零的情况下比较两个字符串”。一种方法是使用正则表达式
(?)将每个字符串分成两部分?