Вы можете использовать регулярное выражение :
import re
words = ['hatch','catch','match','chat','mates']
pattern = re.compile('[^atc]atc[^atc]')
result = list(filter(pattern.fullmatch, words))
print(result)
выход
['hatch', 'match']
Шаблон '[^atc]atc[^atc]'
соответствует всему, что не является a или t или c ([^atc]
), за которым следует 'atc'
, и снова все, что не является a или t или c.
В качестве альтернативы вы можете написать свою собственную функцию сопоставления, которая будет работать с любым шаблоном:
from collections import Counter
def full_match(word, pattern='_atc_'):
if len(pattern) != len(word):
return False
pattern_letter_counts = Counter(e for e in pattern if e != '_') # count characters that are not wild card
word_letter_counts = Counter(word) # count letters
if any(count != word_letter_counts.get(ch, 0) for ch, count in pattern_letter_counts.items()):
return False
return all(p == w for p, w in zip(pattern, word) if p != '_') # the word must match in all characters that are not wild card
words = ['hatch', 'catch', 'match', 'chat', 'mates']
result = list(filter(full_match, words))
print(result)
выход
['hatch', 'match']
Далее
- См. Документацию по встроенным функциям any и all .
- См. Документацию по Счетчик .