Сравнение строк между элементами в списке

#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 для замены имени и года в последней строке списков. Теперь у вас должно быть несколько списков строк, в которых переменный элемент был заменен на нужный вам символ, поэтому мы можем предположить, что переменные считаются равными. Затем мы обычно проверяем, являются ли они одной и той же строкой