Простой способ обработки букв и цифр - PullRequest
1 голос
/ 18 апреля 2020

Допустим, у меня есть две строки:

string_ex1 = 'AbC024'
string_ex2 = 'aBc24'

string_ex3 = 'AbC24'
string_ex4 = 'aBc24'

И я хочу получить результат, чтобы две строки были равны, если я сравниваю друг друга. Например, 'Ab C' == 'aB c', '024' == '24'

Я уже знаю, различаю ли я guish их с \ 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

Ответы [ 2 ]

6 голосов
/ 18 апреля 2020

Вы можете использовать регулярное выражение, которое удаляет начальные нули, а затем использовать 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

В качестве альтернативы, вы можете вызвать lower для обеих строк при вызове re.sub:

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)
0 голосов
/ 18 апреля 2020

Нет встроенного способа сделать это. Я бы посоветовал найти для обеих строк группы: только буквы или только цифры и сравнить их в нижнем регистре и без начальных нулей

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
...