0

Есть ли возможность проверять строку на соответствие нескольким шаблонам?

ExcTC = re.search(r'([TKA]C_)(\S+)(.*)(TS)(.*)(C_TC)', line)

но есть еще 2 шаблона, их как-то можно объединить в одной переменной?

Kromster
  • 13,809
  • 2
    Шаблоны в regex в некоторых случаях можно соиденить через | - но тогда не всегда будет понятно какой из сработал. – nick_n_a Mar 27 '18 at 07:15
  • Да, так и сделал, спасибо! Думал, есть более элегантный способ. Находя один pattern, второй он забивает в массив пустыми элементами в количестве, равному количеству групп regexp. Делает это по порядку. Стоит применять, если со всеми тремя pattern нужно проделать одинаковую операцию (все строки, в которых есть хоть один из 3 шаблонов надо исключить) – Трофим Воробьев Mar 28 '18 at 06:33
  • import re patterns = ['pattern1', 'pattern2']
    text = 'This text includes pattern1 and pattern2'
    for pattern in patterns:
    find = re.search(pattern, text)
    print(find)
    – Трофим Воробьев Mar 28 '18 at 07:59

2 Answers2

3

Если у вас есть два регулярных выражения A и B, то объединённый regex будет:

A|B

который проверяется слева направо.

Если A=C|D, то результат:

C|D|B

Чтобы помнить, что в задаче C|D были одним регулярным выражением, можно их в группу объединить:

(?:C|D)|B

В общем случае, наличие группы может менять смысл выражения. К примеру, a|bc и (?:a|b)c (второе срабатывает для ac).

Если у вас есть список регулярных выражений:

patterns = [A, B, C, D, E, F, G, ...]

то можно объединить их, используя str.join, оборачивая каждое выражение в свою группу с помощью map и str.format:

combined = '|'.join(map('(?:{})'.format, patterns))
jfs
  • 52,361
  • Благодарю, но что-то я ничего не понял. Видать, не тот уровень еще. Для чего такие сложности? Зачем map и format? – Трофим Воробьев Mar 28 '18 at 06:46
  • @ТрофимВоробьев: если знаете проще способ, опубликуйте свой ответ. http://ru.stackoverflow.com/help/self-answer – jfs Mar 28 '18 at 07:37
  • @ТрофимВоробьев опубликуйте в вопросе те два шаблона, про которые написано в вопросе - тогда вам смогут дать более наглядный ответ. Так как вы их не показали - вам дали ответ "в общей форме" – nick_n_a Mar 28 '18 at 08:15
  • @jfs Спасибо большое, что подробно расписали. Я новичок - самоучка, не сразу понял вашу идею. – Трофим Воробьев Mar 29 '18 at 08:04
  • @nick_n_a И Вам большое спасибо, а по поводу, какой pattern сработал, дам ответ. Он более прост в понимании для таких новичков, как я. – Трофим Воробьев Mar 29 '18 at 08:04
2

Проверить текст на наличие неограниченного количества шаблонов в нем можно следующим образом. Данный способ позволит также определить, какой из шаблонов сработал.

import re

text = "one two three four five"
patterns = ['one', 'two']

for pattern in patterns:
    find = re.search(pattern, text)
    if find:
        print('Found "{}" in "{}"'.format(pattern, text))
    else:
        print('Did not find "{}"'.format(pattern))
  • 1
    стоит упомянуть, что этот способ просматривает text c начала для каждого regex¶ Если нужно знать какой шаблон сработал, то можно именованные группы использовать: '(?P<x>A)|(?P<y>B)' -- лучше как отдельный Stack Overflow вопрос спросить¶ Если вы фиксированные строки ищите (не общие регулярные выражения), то есть более эффективные алгоритмы: Поиск повторяющихся строк – jfs Mar 29 '18 at 08:26