Regex для обнаружения одной из нескольких строк

  1. A set является неупорядоченной структурой данных.
  2. Не используйте 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).
  3. Изменить: В приведенном выше ответе предполагается, что вы хотите выполнять (упорядоченно) заданные операции во всех встречающихся коллекциях, в частности, также и в результате предыдущей заданной операции. Если это не обязательно, вы можете просто использовать списки для некоторых коллекций и устанавливать для других, например

    >>> 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.

45
задан Chad Birch 3 April 2009 в 21:48
поделиться

7 ответов

Используйте символ вертикальной черты для указания "или":

/a@(foo|bar|baz)\b/

, Если Вы не хотите группу получения, используйте символ группировки неполучения:

/a@(?:foo|bar|baz)\b/

(Конечно, я принимаю" a", хорошо для передней стороны адреса электронной почты! Необходимо заменить это подходящим regex.)

110
ответ дан Jason Cohen 8 November 2019 в 00:44
поделиться
^(a|b)@(foo|bar|baz)$

, если Вы имеете, это сильно определило список. Запуск и конечный символ будут только искать те три строки.

12
ответ дан Ronak Shah 8 November 2019 в 00:44
поделиться

Использование:

/@(foo|bar|baz)\.?$/i

Примечание различия от других ответов:

  • \.? - соответствие 0 или 1 точке, в случае, если домены в адресе электронной почты "полностью определяются"
  • $ - чтобы указать, что строка должна конец с этой последовательностью,
  • /i - для создания тестового сценария нечувствительным.

Примечание, это предполагает, что каждый адрес электронной почты находится на строке самостоятельно.

, Если строка, являющаяся согласованным, могла бы быть где-нибудь в строке, то отбросьте эти $ и замените ее \s+ (который соответствует одному или нескольким пробельным символам)

5
ответ дан Alnitak 8 November 2019 в 00:44
поделиться

должно быть более универсальным, должен не рассчитывает, хотя должен.

/@(foo|bar|baz)(?:\W|$)/

Здесь хорошая ссылка на regex.

редактирование: изменение, заканчивающееся для разрешения конец шаблона или разрыва слова. теперь принятие foo/bar/baz является полными доменными именами.

2
ответ дан sfossen 8 November 2019 в 00:44
поделиться

Хорошо я знаю, что Вы попросили ответ regex. Но Вы рассмотрели просто разделение строки с символ, принимающий, второе значение массива (домен) и делающий простой тест соответствия

if (splitString[1] == "foo" && splitString[1] == "bar" && splitString[1] == "baz")
{
   //Do Something!
}

Кажется мне, что RegEx является излишеством. Конечно, мое предположение - то, что Ваш случай действительно так прост, как Вы перечислили.

0
ответ дан Andrew Harry 8 November 2019 в 00:44
поделиться

Если предыдущее (и логичный) ответы о '|' не подходят Вам, взглянули на телефон

http://metacpan.org/pod/Regex::PreSuf

описание модуля: создайте регулярные выражения из списков слов

1
ответ дан szabgab 8 November 2019 в 00:44
поделиться

Вам не нужен regex, чтобы найти, содержит ли строка по крайней мере один из данного списка подстрок. В Python:

def contain(string_, substrings):
    return any(s in string_ for s in substrings)

Вышеупомянутое является медленным для большого string_ и много подстрок. GNU fgrep может эффективно искать несколько шаблонов одновременно.

Используя regex

import re

def contain(string_, substrings):
    regex = '|'.join("(?:%s)" % re.escape(s) for s in substrings)
    return re.search(regex, string_) is not None

, Связанный

0
ответ дан jfs 8 November 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: