set
является неупорядоченной структурой данных. set
, а скорее collections.OrderedDict
: >>> a = collections.OrderedDict.fromkeys([1, 2, 20, 6, 210])
>>> b = collections.OrderedDict.fromkeys([6, 20, 1])
>>> collections.OrderedDict.fromkeys(x for x in a if x not in b)
OrderedDict([(2, None), (210, None)])
Обратите внимание, что порядок b
не имеет значения, поэтому он может быть любым итерабельным, но должен быть итерабельным, который поддерживает тесты на членство O (1). Изменить: В приведенном выше ответе предполагается, что вы хотите выполнять (упорядоченно) заданные операции во всех встречающихся коллекциях, в частности, также и в результате предыдущей заданной операции. Если это не обязательно, вы можете просто использовать списки для некоторых коллекций и устанавливать для других, например
>>> a = [1, 2, 20, 6, 210]
>>> b = set([6, 20, 1])
>>> [x for x in a if x not in b]
[2, 210]
. Это теряет порядок b
, не позволяет быстро проверять членство в a
и результат. Наборы позволяют быстро проверять членство, а списки сохраняют порядок. Если вам нужны обе эти функции в одной коллекции, используйте collections.OrderedDict
.
Используйте символ вертикальной черты для указания "или":
/a@(foo|bar|baz)\b/
, Если Вы не хотите группу получения, используйте символ группировки неполучения:
/a@(?:foo|bar|baz)\b/
(Конечно, я принимаю" a
", хорошо для передней стороны адреса электронной почты! Необходимо заменить это подходящим regex.)
^(a|b)@(foo|bar|baz)$
, если Вы имеете, это сильно определило список. Запуск и конечный символ будут только искать те три строки.
Использование:
/@(foo|bar|baz)\.?$/i
Примечание различия от других ответов:
\.?
- соответствие 0 или 1 точке, в случае, если домены в адресе электронной почты "полностью определяются" $
- чтобы указать, что строка должна конец с этой последовательностью, /i
- для создания тестового сценария нечувствительным. Примечание, это предполагает, что каждый адрес электронной почты находится на строке самостоятельно.
, Если строка, являющаяся согласованным, могла бы быть где-нибудь в строке, то отбросьте эти $
и замените ее \s+
(который соответствует одному или нескольким пробельным символам)
должно быть более универсальным, должен не рассчитывает, хотя должен.
/@(foo|bar|baz)(?:\W|$)/
Здесь хорошая ссылка на regex.
редактирование: изменение, заканчивающееся для разрешения конец шаблона или разрыва слова. теперь принятие foo/bar/baz является полными доменными именами.
Хорошо я знаю, что Вы попросили ответ regex. Но Вы рассмотрели просто разделение строки с символ, принимающий, второе значение массива (домен) и делающий простой тест соответствия
if (splitString[1] == "foo" && splitString[1] == "bar" && splitString[1] == "baz")
{
//Do Something!
}
Кажется мне, что RegEx является излишеством. Конечно, мое предположение - то, что Ваш случай действительно так прост, как Вы перечислили.
Если предыдущее (и логичный) ответы о '|' не подходят Вам, взглянули на телефон
http://metacpan.org/pod/Regex::PreSuf
описание модуля: создайте регулярные выражения из списков слов
Вам не нужен regex, чтобы найти, содержит ли строка по крайней мере один из данного списка подстрок. В Python:
def contain(string_, substrings):
return any(s in string_ for s in substrings)
Вышеупомянутое является медленным для большого string_
и много подстрок. GNU fgrep может эффективно искать несколько шаблонов одновременно.
import re
def contain(string_, substrings):
regex = '|'.join("(?:%s)" % re.escape(s) for s in substrings)
return re.search(regex, string_) is not None