#python #string #list
#python #строка #Список
Вопрос:
Я пытаюсь сравнить элементы между двумя списками. Предопределен один список, который является шаблоном, с которым необходимо сравнивать новые списки. Сравнение должно выполняться между элементами с одинаковым индексом между списками. Пример: список 1 [0] должен сравниваться только со списком 2 [0], список 1 [1] должен сравниваться только со списком 2 [1] и т.д. Вывод должен возвращать значение True только в том случае, если все элементы совпадают. Проблема, с которой я сталкиваюсь, заключается в том, что один элемент в предопределенном шаблоне имеет часть, которая будет динамической, при сравнении я должен игнорировать. Как я могу этого добиться
pattern = ['Hi', 'my' , 'name is <xxxxxxxxxxx> age <yy>']
This is defined pattern. Here the contents inside <> is dynamic and has to be ignored.
when comparing list2 = ['Hi', 'my' , 'name is soku age 21'] should be true.
list3 = ['Hi', 'my', 'soku'] should be false
Как я могу добиться этого, потому что обычное сравнение строк между элементами не будет работать.
Другой пример
pattern = ['A', 'B', 'C_<xxxx>_AB']
list1 = ['A', 'B', 'C_aaaa112=22_AB']
This should be true
Комментарии:
1. Является
<xxxxxxxxxxx>
ли формат фиксированным или вы бы подумали о чем-то другом?2. Если формат <xxxxxxxxxxx> и <yy> не является фиксированным, вам придется использовать регулярное выражение для проверки соответствия.
3. Формат не является фиксированным. Но шаблон будет задан пользователем и, вероятно, будет соответствовать вышеуказанному формату
Ответ №1:
Один из подходов заключается в использовании all
и re.fullmatch
:
import re
pattern = ['Hi', 'my', 'name is . age d{2}']
list2 = ['Hi', 'my', 'name is soku age 21']
list3 = ['Hi', 'my', 'soku']
print(all(re.fullmatch(p, l) for p, l in zip(pattern, list2)))
print(all(re.fullmatch(p, l) for p, l in zip(pattern, list3)))
Вывод
True
False
В качестве альтернативы вы можете использовать следующий шаблон:
pattern = ['Hi', 'my', 'name is S age d{2}']
чтобы избежать совпадения символов пробелов.
Шаблон:
.
соответствует любому символу, включая пробел, в то время как
S
соответствует любому символу, который не является пробелом. Кроме того, шаблон:
d{2}
будет соответствовать двум смежным цифрам.
Чтобы динамически создавать шаблон на основе пользовательского ввода, вы могли бы сделать что-то вроде приведенного ниже:
pattern = ['Hi', 'my', 'name is <xxxxxxxxxxx> age <yy>']
regex_pattern = [re.sub(r"<. ?>", r". ", s) for s in pattern]
print(all(re.fullmatch(p, l) for p, l in zip(regex_pattern, list2)))
print(all(re.fullmatch(p, l) for p, l in zip(regex_pattern, list3)))
Вывод
True
False
Комментарии:
1. Как сделать шаблон универсальным? потому что я использовал грубый пример. Содержимое внутри <> будет представлять собой комбинацию десятичных знаков, символов и символов
2. Пример: pattern = [‘A’, ‘B’, ‘C_<xxxx>_AB’]……….. список 1 = [‘A’, ‘B’, ‘C_aaaa112=22_AB’].. должно быть true
3. @Soku list1 = [‘A’, ‘B’, ‘C_aaaa112 22_AB’] верно?
4. ДА.. элементы 1 и 2 соответствуют действительности, элемент 3: содержимое внутри <> должно игнорироваться [‘C_<xxxxx>_AB’] .. ‘C_’ и ‘_AB’ совпадают
5. Я бы сначала сгенерировал шаблоны регулярных выражений из вашего исходного списка шаблонов, что-то вроде re_patterns = [re.compile(re.sub(r'<[^>] >’, ‘. ‘, p)) для p в шаблоне]
Ответ №2:
Если вы хотите сделать это на чистом python, без библиотек, вы можете добавить в переменную, которая хранит год и переменную, затем вы можете использовать replace для замены имени и года в последней строке списков. Теперь у вас должно быть несколько списков строк, в которых переменный элемент был заменен на нужный вам символ, поэтому мы можем предположить, что переменные считаются равными. Затем мы обычно проверяем, являются ли они одной и той же строкой