регулярное выражение, соответствующее каждому элементу в списке
Я вижу, что вы уже получили несколько ответов, исходя из предположения, что "соответствует" каждому элементув списке "вы на самом деле имели в виду" соответствует любому элементу в списке "(ответы на вопросы основаны на |
" или "операторе регулярных выражений).
Если вына самом деле вы хотите, чтобы RE совпадал с каждым элементом списка (в отличие от любого такого элемента), тогда вы можете захотеть сопоставить их либо в том же порядке, что список дает (легко), либов любом порядке (жестко).
Для сопоставления по порядку, '.*?'.join(list_patterns)
должен хорошо служить вам (если элементы действительно должны восприниматься как шаблоны RE - если они должны восприниматься как буквальные)вместо строк '.*?'.join(re.escape(p) for p list_patterns)
).
Для сопоставления любого порядка сами по себе регулярные выражения не предоставляют прямой поддержки.Вы можете взять все перестановки списка (например, с itertools.permutations
), объединить каждую из них с '.*?'
и объединить все с |
- но это может привести к ужасно длинному образцу RE в результате, потому чтоколичество перестановок N
элементов равно N!
(«N factorial» - например, для N, равного 4, перестановки 4 * 3 * 2 * 1 == 24
).Поэтому производительность может легко пострадать, если число элементов в списке не очень велико, очень мало.
Для более общего решения проблемы "сопоставить каждый элемент в произвольном порядке"(если это то, что вам нужно), один с производительностью и объемом памяти, который все еще приемлем для прилично больших длин списка, вам нужно отказаться от цели заставить все это работать с одним объектом RE, и ввести некоторую логику вmix - например, составьте список объектов RE с relist=[re.compile(p) for p in list_patterns]
и отметьте «они все соответствуют строке s
, в любом порядке» с all(r.search(s) for r in relist)
или подобным.
Конечно, есливам нужно, чтобы этот последний подход работал «совместимым с утиной типизацией» с реальными объектами RE, это не сложно, например, если все, что вам нужно, это метод search
, который возвращает логический результат (так как возвращает объект соответствия)"не имеет смысла) ...:
class relike(object):
def __init__(self, list_patterns):
self.relist = [re.compile(p) for p in list_patterns]
def search(self, s):
return all(r.search(s) for r in relist)